Warum ist es in Java möglich, eine Enum -Konstante mit einer anderen Konstante zu qualifizieren?

StackOverflow https://stackoverflow.com/questions/4742178

  •  12-10-2019
  •  | 
  •  

Frage

Vor kurzem ist es möglich, dass es möglich ist,:

class Test {
    public enum Season { WINTER, SPRING, SUMMER, FALL }
    Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}

Gibt es einen Grund dafür?

War es hilfreich?

Lösung

Wenn Sie in Java auf ein statisches Mitglied eines Objekts (einschließlich Enums) zugreifen, ersetzt der Compiler das Objekt effektiv durch seinen statischen Typ. Konkreter,

class ExampleClass {
    static int staticField;
    static void staticMethod() {
        ExampleClass example = new ExampleClass();
        example.staticField;     // Equivalent to ExampleClass.staticField;
        example.staticMethod();  // Equivalent to ExampleClass.staticMethod();
    }
}

In ähnlicher Weise, da Enums effektiv "statisch" sind, Season.WINTER.SPRING ist äquivalent zu Season.SPRING; Season.WINTER wird durch seinen Enum -Typ ersetzt Season.

Als Randnotiz ist der Zugriff auf statische Mitglieder aus Instanzen entmutigt, da dies ziemlich verwirrend sein kann. Zum Beispiel, wenn Sie ein Stück Code gesehen haben, das enthielt someThread.sleep(), Sie könnten dazu gebracht werden, das zu glauben someThread wird einschläfern. Aber seit sleep() ist statisch, dieser Code ruft tatsächlich auf Thread.sleep() das schläft den aktuellen Faden.

Andere Tipps

Es liegt daran, dass Enums eine Art besondere Klassen sind. Wenn wir uns die Felder innerhalb der Saison ansehen. Gewinnen Sie zum Beispiel:

  for (Field field : Test.Season.WINTER.getClass().getFields())
   System.out.println(field);

Wir werden als Ausgabe sehen:

public static final TestEnum$Test$Season TestEnum$Test$Season.WINTER
public static final TestEnum$Test$Season TestEnum$Test$Season.SPRING
public static final TestEnum$Test$Season TestEnum$Test$Season.SUMMER
public static final TestEnum$Test$Season TestEnum$Test$Season.FALL

Jeder Umlaufwert ist also tatsächlich auch a Statische Konstante der Enum -Klasse, der Saison und deshalb haben Zugang zu den statischen Feldern der Saison oder zu den anderen Enum -Werten (einschließlich sich selbst).

Es ist jedoch wahrscheinlich besser, nur auf die Enum -Werte direkt aus der Enum zuzugreifen, wie Saison.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top