今天,我发现自己编写了这样的代码......
public class LocalEnums { public LocalEnums() { } public void foo() { enum LocalEnum { A,B,C }; // .... // class LocalClass { } } }
当编译器报告本地错误时,我有点惊讶enum
:
成员枚举LocalEnum不能是本地的
为什么枚举不能像类一样在本地声明?
我发现这在某些情况下非常有用.在我工作的情况下,其余的代码不需要知道任何关于enum
.
是否有任何结构/设计冲突可以解释为什么这是不可能的,或者这可能是Java 的未来特性?
枚举是静态嵌套类,因为它们定义静态成员变量(枚举值),这对于内部类是不允许的:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html #JLS-8.1.3
更新:我正在查看JLS
(java语言规范)以获取有关静态嵌套类限制的更多详细信息,并且没有找到它(尽管它可能存在,隐藏在不同的主题下).从纯粹的实现角度来看,没有理由不这样做.所以我怀疑这是一个语言哲学问题:不应该这样做,因此不会得到支持.但我不在那里,所以这是纯粹的猜测.
作为评论:如果你的方法足够大,他们需要自己的枚举,那么这是一个强烈的迹象,你需要重构.
我很少发现自己在一个方法中编写任何类型,除非它是一个匿名的内部类.但是,您可以编写嵌套枚举:
public class NestedEnum { private enum MyEnum { X, Y, Z } public void foo() { } }
我不认为我真的想读一个在其中声明一个新类型的方法 - 你是否有任何具体的理由想要在方法中声明它而不仅仅是一个嵌套类型?我可以看到"没有其他方法需要知道"的论点,但我认为评论可以对此进行排序,并且仍然保留更多可读代码.
"嵌套的枚举类型是隐式静态的." 8.9枚词
推断嵌套枚举类型隐式包含静态访问修饰符是合理的.
"如果本地类声明包含以下任何一个访问修饰符,则为编译时错误:public,protected,private或static." 14.3 14.3本地类声明