【问题标题】:Why can't an empty enum have abstract methods?为什么空枚举不能有抽象方法?
【发布时间】:2016-02-13 10:09:22
【问题描述】:

我无意中发现以下内容在 Eclipse 中无法编译:

enum Empty {
    ;
    abstract void foo();
}

JLS 似乎验证了这种行为:

如果枚举声明 E 有一个 abstract 方法 m 作为成员,这是一个编译时错误,除非 E 至少有一个枚举常量并且所有 E 的枚举常量都有提供具体实现的类体m.

我想知道这背后的原因是什么。为什么不将空枚举视为没有现有实现的抽象类?

【问题讨论】:

    标签: java enums abstract-class jls abstract-methods


    【解决方案1】:

    正如您正确指出的那样,在这种情况下,规范要求您至少有一个枚举常量。那是因为不像通常的抽象类,没有现有的实现枚举不能在其他地方实现,因此这种抽象方法变得完全无用。

    对于通常的抽象类,可以稍后从其他来源加载实现,编译器无法知道这一点。但是对于枚举编译器很确定没有实现,所以没有理由声明这样的方法。

    【讨论】:

    • 我们从什么时候开始对无用代码产生编译错误?即使是未使用的局部变量也只是一个警告。根据您的推理,为什么不将空枚举完全设为非法?
    • @shmosel,在 java 中这是常见的做法。例如,尝试在return 语句或无限循环之后编写一些代码。您将收到“无法访问的代码”编译错误。另一个例子是here。一般来说,与 C++ 等其他语言相比,Java 对无用代码非常严格。
    • 未使用的代码和无法访问的代码是有区别的。
    • @shmosel,未使用的代码和根本无法使用且毫无意义的代码之间也存在差异。反正就是这么规定的。讨论是否应该以这种方式指定它会导致我们进行基于意见的谈话。
    • 这个限制特别傻,因为空枚举中的 no 实例方法永远不会被调用,那么为什么要单独列出抽象方法呢?
    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2011-08-31
    • 2018-05-03
    • 2022-06-25
    • 2018-10-25
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多