[英]Strange behavior with Java enums
我遇到了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,特别是8.9.1 ,其中指出:
枚举声明的主体可以包含枚举常量。 枚举常量定义枚举类型的实例。
EnumBody:
{ [EnumConstantList] [,] [EnumBodyDeclarations] }
要理解EnumBody
定义的含义,必须查看JLS第2.4章,语法表示法 ,其中说
产生式右侧的语法{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]
:
EnumBodyDeclarations:
; {ClassBodyDeclaration}
您错误地指定了EnumBodyDeclarations
,如上面的摘录所示,该EnumBodyDeclarations
是非可选的分号,后跟零个或多个ClassBodyDeclaration
。
它包含非可选的分号,后跟有效的ClassBodyDeclaration
。
ew
这也意味着以下是有效的枚举声明:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.