正如另一个答案所指出的,JLS 的相关部分是 8.9,特别是 8.9.1,其中指出:
枚举声明的主体可能包含枚举常量。枚举常量定义了枚举类型的一个实例。
EnumBody:
{ [EnumConstantList] [,] [EnumBodyDeclarations] }
要了解EnumBody 定义的含义,必须查看JLS Chapter 2.4, Grammar Notation,它说
产生式右边的语法 {x} 表示零或
x 的出现次数更多。
还有
产生式右边的语法 [x] 表示零或
x 出现一次。也就是说,x 是可选符号。这
包含可选符号的替代实际上定义了两个
替代品:一种省略可选符号,另一种包括
它。
这与您的问题有何关系?这意味着有效的枚举声明如下(以下是一些语法符号,请耐心等待):
public enum Test {
}
public enum Test {
[EnumConstantList]
}
public enum Test {
[EnumConstantList] ,
}
public enum Test {
,
}
public enum Test {
[EnumBodyDeclarations]
}
public enum Test {
, [EnumBodyDeclarations]
}
public enum Test {
[EnumConstantList] [EnumBodyDeclarations]
}
public enum Test {
[EnumConstantList] , [EnumBodyDeclarations]
}
[EnumConstantList] 并不那么有趣,因为这是人们所期望的:
EnumConstant {, EnumConstant}
也就是说,一个或多个EnumConstant,用逗号分隔(我不会深入EnumConstant的定义,我已经陷入了一个足够深的兔子洞,而且它与问题无关)。
[EnumBodyDeclarations] 的定义让事情变得有趣(终于):
EnumBodyDeclarations:
; {ClassBodyDeclaration}
这就是您的第一个示例无效的原因
您错误地指定了EnumBodyDeclarations,如上面的摘录所示,它是一个非可选分号,后跟零个或多个ClassBodyDeclaration。
这就是您的第二个示例有效的原因
它包含非可选分号,后跟有效的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;
}
但从来没有
public enum Test {
CAT,
public static final int C1 = 5;
}