65 votes

Pourquoi ne peut-enums être déclarée localement dans une méthode?

Aujourd'hui, je me suis retrouvé codage quelque chose comme ça ...

public class LocalEnums {

    public LocalEnums() {
    }

    public void foo() {
    	enum LocalEnum {
    		A,B,C
    	};

    	// ....
    	// class LocalClass { }

    }
}

et j'ai été un peu surpris lorsque le compilateur a signalé une erreur sur le local enum:

Le membre enum LocalEnum ne peut pas être local

Pourquoi ne peut - enums être déclaré locales comme les classes?

J'ai trouvé cela très utile dans certaines situations. Dans le cas où je travaillais, le reste du code n'a pas besoin de savoir quelque chose au sujet de l' enum.

Est-il structurel/design conflit qui explique pourquoi ce n'est pas possible ou est-ce une future fonctionnalité de Java?

37voto

kdgregory Points 21849

Les énumérations sont statiques de classes imbriquées, car elles définissent membre statique des variables (les valeurs enum), et c'est refusé pour les classes internes: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.3

Mise à jour: j'étais à la recherche par le biais de la JLS pour plus de détails sur les restrictions de la statique des classes imbriquées, et n'a pas à le trouver (même si c'est probablement là, caché sous un autre sujet). D'un pur point de vue de la mise en œuvre, il n'y a pas de raison que ce ne pouvait pas être fait. Donc je pense que c'était un problème de la philosophie du langage: il ne faut pas faire, ne seront donc pas pris en charge. Mais je n'étais pas là, donc c'est de la pure spéculation.

Comme un commentaire: si vos méthodes sont assez gros pour qu'ils exigent de leurs propres enums, alors c'est un signe fort que vous avez besoin d'un refactoring.

16voto

Jon Skeet Points 692016

J'ai rarement me retrouve à écrire tous les types à l'intérieur d'une méthode, sauf si c'est un anonyme intérieur de la classe. Vous pouvez, cependant, écrire imbriqués les énumérations:

public class NestedEnum
{
    private enum MyEnum
    {
        X, Y, Z
    }

    public void foo()
    {
    }
}

Je ne pense pas que j'avais vraiment envie de lire une méthode qui a déclaré un nouveau type de sein - ne vous ai aucune raison de vouloir déclarer à l'intérieur de la méthode au lieu de simplement comme un type imbriqué? Je peux voir le "pas d'autres méthodes ont besoin de savoir" argument, mais je pense qu'un commentaire peut régler ça et toujours laisser un code plus lisible.

11voto

emory Points 6319
  1. "Imbriqués les types enum sont implicitement statiques". 8.9 les Énumérations

  2. Il est raisonnable de conclure que imbriqués les types enum contiennent implicitement la statique modificateur d'accès.

  3. "C'est une erreur de compilation si un local de la déclaration de classe contient tout l'un des accès suivants modificateurs: public, protected, privé, ou statique."14.3 14.3 Local Déclarations De Classe

3voto

no_ripcord Points 794

C'est bizarre, parce que le java intérieure définition de la classe dit que les constantes de compilation peut être déclarée statique, et un membre d'un Enum est clairement constante à la compilation, plus enum est une classe statique, suposedly...

Documentation:

8.1.3 les Classes internes et en Joignant les Instances

(...) Les classes internes peuvent ne pas déclarer statique des membres, à moins qu'ils sont au moment de la compilation champs constants.

class Outer{
    class Inner extends HasStatic{
    	static final int x = 3;			// ok - compile-time constant
    	static int y = 4; 			// compile-time error, an inner class
    }
    static class NestedButNotInner{
    	static int z = 5; 			// ok, not an inner class
    }
    interface NeverInner{}				// interfaces are never inner
}

2voto

Peter Points 1681

http://mindprod.com/jgloss/enum.html donne une bonne description de java enums - comme mentionné précédemment, les énumérations sont définis comme statique de sorte qu'ils ne peuvent pas être déclarés comme des habitants

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