我使用java Enums遇到了奇怪的行为。如果你写下一个枚举:
public enum Test {
public static final int C1 = 5;
}
你遇到了编译错误,因为你没有在开头声明枚举常量。
但奇怪的是,如果你只是在开头添加一个没有常量名称的分号:
public enum Test {
;
public static final int C1 = 5;
}
您的代码将成功编译。
也许我的问题很愚蠢,java规范中有答案,但我还没有找到答案。
如果有人理解为什么java编译器会这样做,请解释。
答案 0 :(得分:2)
表示您正在创建一个空枚举。默认情况下,枚举应该具有很少的枚举值。所以这里的分号被视为空枚举。创建这样的枚举
是一种不好的做法答案 1 :(得分:1)
Java枚举可以包含字段和方法以及常规枚举值:
enum Color {
RED,
GREEN,
BLUE;
public static final int C1 = 5;
}
通过将分号放在那里创建的只是一个没有任何值的枚举。相当无用,但可能。
答案 2 :(得分:1)
枚举体必须包含枚举常量,可选其他类组件(方法等)。
请参阅Java Language Spec section 8.9
您的第一个示例声明没有常量和公共最终静态字段。您的第二个示例首先包含空常量列表(并且违反直觉有效)
您可以采用第二个示例并添加枚举常量,例如
public enum Test {
INSERTED_ENUM;
public static final int C1 = 5;
}
进一步证明这一点。
答案 3 :(得分:1)
正如另一个答案所指出的,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;
}