web-dev-qa-db-fra.com

En Java, les types enum dans une classe sont-ils statiques?

Je n'arrive pas à accéder aux membres d'instance de la classe environnante depuis une enum, comme je pourrais le faire depuis une classe interne. Est-ce que cela signifie que les enums sont statiques? Existe-t-il un accès à la portée de l'instance de la classe environnante ou dois-je passer l'instance à la méthode de l'énumération 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;
    }
}
118
Hanno Fietz

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

De la spécification de langue section 8.9 :

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

171
Jon Skeet

Il ne serait pas logique de créer une classe enum interne au niveau instance (non statique) - si les instances enum étaient elles-mêmes liées à la classe externe, elles casseraient la garantie enum -

par exemple. si tu avais

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

Pour que les valeurs enum agissent correctement en tant que constantes (psuedocode, en 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.

45
Steve B.