【问题标题】:Why the enum constants must be declared before any other variables and methods declaration in an enum type?为什么枚举常量必须在枚举类型中的任何其他变量和方法声明之前声明?
【发布时间】:2013-06-27 08:26:12
【问题描述】:

如果我在以这种方式声明枚举常量之前或不声明变量:

enum MyEnum
{
    int i = 90;
}

它显示以下编译错误。

MyEnum.java:3: <identifier> expected
{
 ^
MyEnum.java:4: ',', '}', or ';' expected
        int i = 90;
        ^
MyEnum.java:4: '}' expected
        int i = 90;
             ^
MyEnum.java:5: class, interface, or enum expected
}
^
4 errors

但是,如果我在声明 i 之前声明了一个枚举常量,那么它编译得很好。
甚至下面的代码也能编译得很好:

enum MyEnum
{
    ;//put a semicolon
    int i = 90;
}

为什么java枚举是这样设计的?

【问题讨论】:

  • 首先,enum 被设计成一个由多个元素组成的枚举。这个设计完全有效。
  • 因为必须有至少一个枚举常量。因为这是 Java 语言规范中定义语法的方式。因为。
  • @EJP 但在后来的情况下,我没有声明任何枚举常量,而是在声明变量之前简单地附加了一个分号。 Enum 至少应该有一个枚举常量,这不违反规定吗?
  • 这意味着没有枚举常量。编译器需要一种方法来知道枚举常量在哪里停止而其他东西从哪里开始。这就是语言设计者选择的方式。
  • @EJP 谢谢。这就是我想知道的......这是纯粹的语言设计师的选择......

标签: java syntax enums


【解决方案1】:

; 表示枚举标识符列表的结尾。显然你可以有一个空的枚举列表,但你必须有一个。

参见Java Language Specification 中的8.9.1

8.9.1 枚举常量
枚举类型的主体可能包含枚举常量

【讨论】:

  • 特别是:EnumBodyDeclarations: ; ClassBodyDeclarationsopt
  • 感谢快速响应和 JLS 的相关链接。是的,我通过了那个链接。但是我无法为 java 中的枚举提供这种设计约束的原因。那么,最后应该假设这只是 java 选择设计枚举的方式吗?没有其他原因,例如:JVM 在加载、初始化或任何其他方面处理枚举的方式......
【解决方案2】:

枚举的两个强制性部分是:

  1. 枚举标识符;
  2. 枚举正文。

您必须先声明枚举标识符列表,然后再声明枚举主体。 在这里,; 显示第一部分,因为第一部分是强制性的。如果你忽略它,它会产生一个编译错误。如果您添加;,那么它将在您同时满足两个条件时编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多