如何定义Enum项目的属性

我已经阅读了Java和C ++之间的枚举差异? 但我仍然困惑。

我想下面的返回相关的string:

public enum Checker { EMPTY ("Empty"), RED ("Red"), YELLOW ("Yellow"); } 

从我所读到的,这应该是可能的。 只是希望您能对此有所了解。

简答

你需要一个构造函数,一个字段和一个getter。

构造函数

枚举types可以有构造函数,只要它们的访问级别是私有的或默认的(包私有的)。 你不能直接调用这些构造函数,除非在枚举声明本身。 与类相似,当你定义一个不带参数的枚举常量时,你实际上调用了编译器生成的默认构造函数。 例如

 public enum King{ ELVIS } 

相当于

 public enum King{ ELVIS() // the compiler will happily accept this } 

就像在类中一样,如果你定义了一个显式的构造函数,编译器将不会插入一个默认的构造函数,所以不能编译:

 public enum King{ ELVIS, // error, default constructor is not defined MICHAEL_JACKSON(true) ; private boolean kingOfPop; King(boolean kingOfPop){this.kingOfPop = kingOfPop;} } 

这是一个非常好的枚举参考 ,也解释了构造函数的问题。

字段和访问者

枚举是常量,并且是不可变的。 然而,他们可以定义可以具有状态的字段。 这是一个糟糕的做法,因为开发人员会期望枚举及其相关的值是常量,但您仍然可以在枚举中使用getter和setter 定义非final字段。

这是合法的java代码:

 public enum Color{ RED("FF0000"), GREEN("00FF00"), BLUE("0000FF"); private String code; public String getCode(){return code;} public void setCode(String code){this.code = code;} private Color(String code){this.code = code;} } 

但它可以这样的邪恶的代码:

 String oldBlue = Color.BLUE.getCode(); Color.BLUE.setCode(Color.RED.getCode()); Color.RED.setCode(oldBlue); 

所以在99.99%的情况下:如果你在你的枚举中有字段,你应该使它们成为final,并且只提供getter。 如果这些字段本身不可改变,请提供防御性的副本:

 public enum Band{ THE_BEATLES("John","Paul","George","Ringo"); private final List<String> members; public List<String> getMembers(){ // defensive copy, because the original list is mutable return new ArrayList<String>(members); } private Band(String... members){ this.members=Arrays.asList(members); } } 

在你的情况下,它很简单:你只需要一个stringtypes(不可变)的单个字段,所以在构造函数中初始化它,并提供一个getter是完全正确的:

 public enum Checker { EMPTY ("Empty"), RED ("Red"), YELLOW ("Yellow"); private final String value; private Checker(final String value) { this.value = value; } public String getValue() { return value; } } 

如果模式成立,这也起作用,并消除了重复:

 public enum Checker { EMPTY, RED, YELLOW; public String getDescription(){ String name = name(); return ""+Character.toUpperCase(name.charAt(0)) +name.substring(1).toLowerCase(); } }