ich eine Frage mit einem Enum innerhalb einer switch-Anweisung in Java haben:Java-Schalter über einen ENUM nicht erkennt, dass alle Fälle abgedeckt sind
ich eine Enum in Java deklarieren und eine Variable dieses Typs in einem Schalter verwenden Anweisung, in der alle möglichen Fälle für enum-Werte behandelt werden. Im Beispiel initialisiert jeder Fall eine Variable, die nicht vor dem Schalter initialisiert wurde, aber der Compiler gibt mir noch einen Fehler, da javac nicht erkennt, dass alle möglichen Fälle abgedeckt sind:
public class EnumSwitchTest {
public enum MyEnum {
FOO,
BAR
}
public static void main(String[] args) {
test(MyEnum.FOO);
test(MyEnum.BAR);
}
private static void test(MyEnum e) {
String msg;
switch (e) {
case FOO:
msg = "foo";
break;
case BAR:
msg = "bar";
break;
}
// Why does the compiler think it is possible to reach here
// and msg could still be uninitialized?
System.out.println("Enum is: " + e + " msg is: " + msg);
}
}
Warum ist der Compiler nicht in der Lage Erkennen, dass dieser Schalter immer msg
initialisieren wird (oder eine NullPointerException werfen, weil e
null
ist)?
Was ich erreichen möchte, ist eine switch-Anweisung, die alle Fälle behandelt, aber zu einem Kompilierungsfehler führt, wenn die Enum-Klasse in der Zukunft erweitert wird, aber kein neuer Fall zum Switch hinzugefügt wird.
Es ist möglich, neue Instanzen eines Enums mit Reflection Witchery zu erstellen. – immibis
@immibis Selbst wenn es möglich wäre, sollte der Compiler nicht unbedingt darüber nachdenken. – biziclop
Die meisten Compiler können dies erkennen, aber die Java-Sprachspezifikation erlaubt ihnen nicht, die Kompilierung abzubrechen. Stattdessen gibt es nur [empfiehlt] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11) eine Warnung über fehlende Switch Cases für Enum-Werte. –