当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么不能在方法中本地声明枚举?》经验,为你挑选了3个好方法。

今天,我发现自己编写了这样的代码......

public class LocalEnums {

    public LocalEnums() {
    }

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

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

    }
}

当编译器报告本地错误时,我有点惊讶enum:

成员枚举LocalEnum不能是本地的

为什么枚举不能像一样在本地声明?

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

是否有任何结构/设计冲突可以解释为什么这是不可能的,或者这可能是Java 的未来特性?



1> kdgregory..:

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

更新:我正在查看JLS(java语言规范)以获取有关静态嵌套类限制的更多详细信息,并且没有找到它(尽管它可能存在,隐藏在不同的主题下).从纯粹的实现角度来看,没有理由不这样做.所以我怀疑这是一个语言哲学问题:不应该这样做,因此不会得到支持.但我不在那里,所以这是纯粹的猜测.

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


kdgregory,我的方法不必那么大,使用枚举的*power*...枚举可以简化/澄清你的代码.因此,重构可能不是问题.
@dhardy - Language philosophy is*everything*: what to include, what to exclude, and how the language looks. If you don't have a philosophy, you get PHP.
哲学没有理由排除某个特征.缺乏有用性,导致危险代码的可能性(令人惊讶或不明确的行为)和包含的技术难度是正当理由.但我不明白为什么这些适用于此.

2> Jon Skeet..:

我很少发现自己在一个方法中编写任何类型,除非它是一个匿名的内部类.但是,您可以编写嵌套枚举:

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

    public void foo()
    {
    }
}

我不认为我真的想一个在其中声明一个新类型的方法 - 你是否有任何具体的理由想要在方法中声明它而不仅仅是一个嵌套类型?我可以看到"没有其他方法需要知道"的论点,但我认为评论可以对此进行排序,并且仍然保留更多可读代码.



3> emory..:

    "嵌套的枚举类型是隐式静态的." 8.9枚词

    推断嵌套枚举类型隐式包含静态访问修饰符是合理的.

    "如果本地类声明包含以下任何一个访问修饰符,则为编译时错误:public,protected,private或static." 14.3 14.3本地类声明


@dhardy我100%同意.我们应该能够在方法中放置枚举和接口.我的回答只是解释了为什么政策禁止本地枚举.我绝对不同意这个政策.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有