如何定义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(); } }