意外的令牌 - Java 枚举

Unexpected Token - Java Enum

java 中是否有任何选项可以像下面这样使用 true 和 false 创建枚举,

public enum options {
true,
false,
both
}

我正在使用 true 和 false,现在出现意外的令牌错误。谢谢

问候 春

没有。从JLS 8.9.1开始,一个枚举常量在语法中被定义为

EnumConstant:
    {EnumConstantModifier} Identifier [( [ArgumentList] )] [ClassBody] 

所以它是 Identifier。而从JLS 3.8,而Identifier定义为

Identifier:
    IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral 

因此,标识符是任何有效的标识符字符串(基本上是字母和数字,但加入了 Unicode 支持),不是关键字(例如if) 或单词 truefalsenull.

实际上,您的 enum 名字无论如何都应该大写,这样看起来更像

public enum Options {
  TRUE, FALSE, BOTH
}

这不会造成任何问题,因为 TRUEFALSE 不是 Java 中的布尔文字。

枚举的值应该像常量一样格式化; all-caps 单词之间有下划线(如果它们不止一个单词,在你的例子中,它们不是)。如果你需要能够转换它们 to/from 与枚举常量的名称和大小写不匹配的字符串,我建议添加一个参数,其中包含要在每个方向转换的字符串和方法:

public enum Options {
    TRUE("true"),
    FALSE("false"),
    BOTH("both");
    
    private final String description;
    
    private Options(final String description) {
        this.description = description;
    }
    
    public String getDescription() {
        return description;
    }
    
    public static Options parse(String description) {
        for (Options option : Options.values()) {
            if (option.getDescription().equals(description)) {
                return option;
            }
        }
        throw new IllegalArgumentException("no such option: " + description);
    }
}

如果您调用 Options.parse("true"),它将 return Options.TRUE,如果您调用 Options.TRUE.getDescription(),它将 return "true"。如果你调用 Options.parse("none") 它会抛出一个 IllegalArgumentException.