Java枚举

时间:2017-03-28 13:52:28

标签: java enums

我使用java Enums遇到了奇怪的行为。如果你写下一个枚举:

public enum Test {
   public static final int C1 = 5;
}

你遇到了编译错误,因为你没有在开头声明枚举常量。

但奇怪的是,如果你只是在开头添加一个没有常量名称的分号:

public enum Test {
   ;
   public static final int C1 = 5;
}

您的代码将成功编译。

也许我的问题很愚蠢,java规范中有答案,但我还没有找到答案。

如果有人理解为什么java编译器会这样做,请解释。

4 个答案:

答案 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;
}