繁体   English   中英

Java枚举的奇怪行为

[英]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;
}

您将分号放在此处创建的只是一个没有任何值的枚举。 毫无用处,但可能。

枚举主体必须包含枚举常量和可选的其他类组件(方法等)。

参见Java语言规范8.9节

您的第一个示例不声明任何常量,并且声明一个公共的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM