Pourquoi les énumérations ne peuvent-elles pas être déclarées localement dans une méthode?

Aujourd’hui, je me suis retrouvé à coder 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 quand le compilateur a signalé une erreur sur l’ enum locale:

Le membre enum LocalEnum ne peut pas être local

Pourquoi les énumérations ne peuvent-elles pas être déclarées locales comme les classes ?

J’ai trouvé cela très utile dans certaines situations. Dans le cas où je travaillais, le rest du code n’avait pas besoin de savoir quoi que ce soit sur l’ enum .

Y a-t-il des conflits structurels / de conception qui expliquent pourquoi ce n’est pas possible ou cela pourrait-il être une future fonctionnalité de Java?

Les énumérations sont des classes nestedes statiques car elles définissent des variables de membre statiques (les valeurs enum) , ce qui est interdit pour les classes internes : http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html # jls-8.1.3

Mise à jour: Je cherchais à travers le JLS ( spécification du langage Java ) pour plus de détails sur les ressortingctions des classes nestedes statiques, et je ne l’ai pas trouvé (même s’il est probablement caché sous un autre sujet). Du sharepoint vue de la mise en œuvre, il n’y a aucune raison pour que cela ne soit pas possible. Donc, je soupçonne que c’était un problème de philosophie de la langue: cela ne devrait pas être fait, donc pas supporté. Mais je n’étais pas là, donc c’est de la pure spéculation.

En guise de commentaire: si vos méthodes sont suffisamment volumineuses pour nécessiter leur propre énumération, alors le fait que vous ayez besoin d’un remaniement est un signe fort.

Je me trouve rarement en train d’écrire des types dans une méthode, sauf si c’est une classe interne anonyme. Vous pouvez cependant écrire des énumérations nestedes:

 public class NestedEnum { private enum MyEnum { X, Y, Z } public void foo() { } } 

Je ne pense pas que je veuille vraiment lire une méthode qui a déclaré un nouveau type en elle – avez-vous des raisons concrètes de vouloir le déclarer à l’intérieur de la méthode plutôt que simplement comme un type nested? Je peux voir l’argument “aucune autre méthode n’a besoin de savoir”, mais je pense qu’un commentaire peut sortinger et laisser un code plus lisible.

  1. “Les types enum nesteds sont implicitement statiques.” 8,9 Enums

  2. Il est raisonnable de déduire que les types enum nesteds contiennent implicitement le modificateur d’access statique.

  3. “Il s’agit d’une erreur de compilation si une déclaration de classe locale contient l’un des modificateurs d’access suivants: public, protected, private ou static.” 14.3 14.3 Déclarations de classes locales

C’est bizarre parce que la définition de la classe interne java dit que les constantes à la compilation peuvent être déclarées statiques, et qu’un membre d’un Enum est clairement constant à la compilation, et que enum est une classe statique, si …

Documentation :

8.1.3 Classes internes et instances fermantes

(…) Les classes internes ne peuvent pas déclarer de membres statiques, sauf s’il s’agit de champs constants à la compilation.

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

http://mindprod.com/jgloss/enum.html donne une bonne description des énumérations java – comme mentionné précédemment, les énumérations sont définies comme statiques, elles ne peuvent donc pas être déclarées en tant que locaux