En Java, les types enum à l'intérieur d'une classe sont-ils statiques?

123

Je n'arrive pas à accéder aux membres d'instance de la classe environnante depuis l'intérieur d'une énumération, comme je le pourrais depuis l'intérieur d'une classe interne. Cela signifie-t-il que les énumérations sont statiques? Y a-t-il un accès à la portée de l'instance de la classe environnante, ou dois-je passer l'instance dans la méthode enum là où j'en ai besoin?

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
la source
Je ne suis pas sûr de bien comprendre ce que vous essayez de décrire. pouvez-vous donner un petit exemple de code peut-être?
Pete

Réponses:

176

Oui, les énumérations imbriquées sont implicitement statiques.

De la section 8.9 de spécification de langue :

Les types enum imbriqués sont implicitement statiques. Il est permis de déclarer explicitement un type enum imbriqué comme étant statique.

Jon Skeet
la source
45

Cela n'aurait pas de sens de créer une classe d'énumération interne au niveau de l'instance (non statique) - si les instances d'énumération étaient elles-mêmes liées à la classe externe, elles briseraient la garantie d'énumération -

par exemple si vous aviez

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

Pour que les valeurs d'énumération agissent correctement comme des constantes, (psuedocode, ignorant les restrictions d'accès)

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

b1 et b2 devraient être les mêmes objets.

Steve B.
la source