121 votes

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

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 enum 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;
    }
}
 

173voto

Jon Skeet Points 692016

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

Dans 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.

45voto

Steve B. Points 23227

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 d'énumération -

par exemple si vous aviez

 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X