Java枚举的奇怪行为

Java枚举的奇怪行为,java,enums,Java,Enums,我在java枚举中遇到了奇怪的行为。如果编写下一个枚举: public enum Test { public static final int C1 = 5; } 您遇到编译错误,这是预期的,因为您在开始时没有声明枚举常量 但奇怪的是,如果您只是在开头添加一个分号而没有常量名称: public enum Test { ; public static final int C1 = 5; } 您的代码将被成功编译 也许我的问题是愚蠢的,java规范中有答案,但我还没有找到答案

我在java枚举中遇到了奇怪的行为。如果编写下一个枚举:

public enum Test {
   public static final int C1 = 5;
}
您遇到编译错误,这是预期的,因为您在开始时没有声明枚举常量

但奇怪的是,如果您只是在开头添加一个分号而没有常量名称:

public enum Test {
   ;
   public static final int C1 = 5;
}
您的代码将被成功编译

也许我的问题是愚蠢的,java规范中有答案,但我还没有找到答案


如果有人理解java编译器为什么这样做,请解释。

java枚举可以包含字段和方法以及常规枚举值:

enum Color {
  RED,
  GREEN,
  BLUE;

  public static final int C1 = 5;
}

通过将分号放在那里创建的只是一个没有任何值的枚举。相当无用,但有可能。

表示您正在创建一个空枚举。默认情况下,枚举应具有很少的枚举值。因此,这里的分号被视为空枚举。创建这样的枚举是一种不好的做法

枚举体必须包含枚举常量,以及可选的其他类组件(方法等)

第一个示例没有声明任何常量和公共的final静态字段。第二个示例首先包含一个空的常量列表(这与直觉相反)

您可以以第二个示例为例,添加一个枚举常量,例如

public enum Test {
   INSERTED_ENUM;
   public static final int C1 = 5;
}

为了进一步证明这一点。

正如另一个答案所指出的,JLS的相关章节为8.9,具体说明如下:

枚举声明的主体可能包含枚举常量。枚举常量定义枚举类型的实例

EnumBody:

{[EnumConstantList][,][EnumBodyDeclarations]}

要理解
EnumBody
定义的含义,必须查看以下内容:

产生式右边的语法{x}表示零或零 更多的x

而且

产品右侧的语法[x]表示零或零 x的一个实例。也就是说,x是可选符号。这个 包含可选符号的alternative实际上定义了两个 备选方案:一个省略可选符号,另一个包含 它

这与你的问题有什么关系?这意味着有效的枚举声明如下所示(请记住,下面是一些语法符号):

[EnumConstantList]
没有那么有趣,因为它是人们所期望的:

EnumConstant{,EnumConstant}

也就是说,一个或多个由逗号分隔的
enumcontent
(我不想讨论
enumcontent
的定义,我掉进了一个足够深的兔子洞,而且它与问题无关)

通过以下定义,事情变得有趣(最后):

EnumBodyDeclarations:

;{ClassBodyDeclaration}

这就是为什么你的第一个例子是无效的 您错误地指定了
EnumBodyDeclarations
,如上摘录所示,它是一个非可选分号,后跟零或多个
ClassBodyDeclarations

这就是为什么你的第二个例子是有效的 它包含非可选分号,后跟有效的
ClassBodyDeclaration

这也意味着以下是有效的枚举声明:

public enum Test {
 ;
}

public enum Test {
 ,;
}

public enum Test {
   ,;
   public static final int C1 = 5;
}

public enum Test {
   CAT,
}

public enum Test {
   CAT;
}

public enum Test {
   CAT,;
}

public enum Test {
   CAT,;
   public static final int C1 = 5;
}

public enum Test {
   CAT;
   public static final int C1 = 5;
}
但从来没有
也许这有助于理解一点:谢谢你努力写出如此全面的答案!您是否测试这些枚举声明?第二个和第三个未编译。因此,枚举体的正确声明应该是:{[EnumConstantList[,]][EnumBodyDeclarations]}我测试了它们,并且它们都是用Java8编译的,包括第二个和第三个示例。您使用的是什么版本的Java?编译器的抱怨是什么?对不起,我用maven构建了我的项目,我没有注意到在验证阶段构建失败而不是编译。这是因为我在pom中添加了checkstyle插件。
public enum Test {
 ;
}

public enum Test {
 ,;
}

public enum Test {
   ,;
   public static final int C1 = 5;
}

public enum Test {
   CAT,
}

public enum Test {
   CAT;
}

public enum Test {
   CAT,;
}

public enum Test {
   CAT,;
   public static final int C1 = 5;
}

public enum Test {
   CAT;
   public static final int C1 = 5;
}
public enum Test {
   CAT,
   public static final int C1 = 5;
}