Java枚举的奇怪行为
我在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规范中有答案,但我还没有找到答案
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;
}