Sind Aufzählungstypen in Java innerhalb einer Klasse statisch?

123

Ich kann scheinbar nicht von einer Enumeration aus auf Instanzmitglieder der umgebenden Klasse zugreifen, wie ich es von einer inneren Klasse aus tun könnte. Bedeutet das, dass Aufzählungen statisch sind? Gibt es einen Zugriff auf den Bereich der Instanz der umgebenden Klasse oder muss ich die Instanz an die Methode der Aufzählung übergeben, wo ich sie benötige?

public class Universe {
    public final int theAnswer;

    public enum Planet {
        // ...
        EARTH(...);
        // ...

        // ... constructor etc.

        public int deepThought() {
            // -> "No enclosing instance of type 'Universe' is accessible in this scope"
            return Universe.this.theAnswer;
        }
    }

    public Universe(int locallyUniversalAnswer) {
        this.theAnswer = locallyUniversalAnswer;
    }
}
Hanno Fietz
quelle
Ich bin mir nicht sicher, ob ich wirklich verstehe, was Sie beschreiben wollen. Können Sie vielleicht ein kleines Codebeispiel geben?
Pete

Antworten:

176

Ja, verschachtelte Aufzählungen sind implizit statisch.

Aus der Sprachspezifikation Abschnitt 8.9 :

Verschachtelte Aufzählungstypen sind implizit statisch. Es ist zulässig, einen verschachtelten Aufzählungstyp explizit als statisch zu deklarieren.

Jon Skeet
quelle
45

Es wäre nicht sinnvoll, eine innere Aufzählungsklasse auf Instanzebene (nicht statisch) zu erstellen. Wenn die Aufzählungsinstanzen selbst an die äußere Klasse gebunden wären, würden sie die Aufzählungsgarantie brechen.

zB wenn du hattest

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

Damit die Aufzählungswerte ordnungsgemäß als Konstanten fungieren (Pseudocode, Zugriffsbeschränkungen ignorieren)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 und b2 müssten die gleichen Objekte sein.

Steve B.
quelle