为什么不能用方法在本地声明枚举?

今天,我发现自己编码这样的…

public class LocalEnums { public LocalEnums() { } public void foo() { enum LocalEnum { A,B,C }; // .... // class LocalClass { } } } 

当编译器在本地enum报告错误时,我感到很惊讶:

成员枚举LocalEnum不能是本地的

为什么不能枚举声明本地像

我发现这在某些情况下非常有用。 在我工作的情况下,其余的代码不需要知道任何关于enum

有没有结构/devise冲突解释为什么这是不可能的,或者这可能是Java的未来function?

枚举是静态嵌套类,因为它们定义了静态成员variables(枚举值) ,并且这是不允许的内部类 : http : //docs.oracle.com/javase/specs/jls/se7/html/jls-8.html #JLS-8.1.3

更新:我正在通过JLSJava语言规范 )查看有关静态嵌套类的限制的更多细节,但没有find它(尽pipe可能存在,隐藏在不同的主题下)。 从纯粹的实施angular度来看,没有理由不这样做。 所以我怀疑这是一个语言哲学问题:不应该这样做,所以不会被支持。 但是我不在那里,所以这是纯粹的猜测。

作为一个评论:如果你的方法是足够大,他们需要自己的枚举,那么这是一个强有力的迹象,你需要重构。

除非是匿名的内部类,否则我很less发现自己在方法中写了任何types 。 但是,您可以编写嵌套的枚举:

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

我不认为我真的想要读取一个方法,在其中声明一个新的types – 你有任何具体的理由要声明它的方法内而不是只是一个嵌套的types? 我可以看到“没有其他方法需要知道”的说法,但我认为一个评论可以排除这一点,仍然留下更多的可读代码。

  1. “嵌套的枚举types是隐式静态的。” 8.9枚举

  2. 推断嵌套的枚举types隐含地包含静态访问修饰符是合理的。

  3. “如果本地类声明包含以下任何访问修饰符:public,protected,private或static,则这是编译时错误。 14.3 14.3本地类声明

这很奇怪,因为java的内部类定义说编译时常量可以声明为静态的,而Enum的成员显然是编译时常量,加上枚举是一个静态类,suposedly …

文档 :

8.1.3内部类和包含实例

(…)内部类可能不声明静态成员,除非它们是编译时常量字段。

 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 } 

http://mindprod.com/jgloss/enum.html给出了java枚举的一个很好的描述; – 如前所述,枚举被定义为静态的,所以它们不能被声明为locals