作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已阅读问题 Difference of Enum between java and C++?但我还是一头雾水。
我希望以下返回相关的字符串:
public enum Checker {
EMPTY ("Empty"),
RED ("Red"),
YELLOW ("Yellow");
}
根据我的阅读,这应该是可能的。只是希望您对如何实现它有所了解。
最佳答案
您需要一个构造函数、一个字段和一个 getter。
枚举类型可以有构造函数,前提是它们的访问级别是私有(private)的或默认的(包私有(private))。您不能直接调用这些构造函数,除非在枚举声明本身中。与类类似,当你定义一个不带参数的枚举常量时,实际上是调用了编译器生成的默认构造函数。例如
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;}
}
这是a pretty good reference on enums这也解释了构造函数的问题。
枚举是常量,因此是不可变的。但是,它们可以定义可以具有状态的字段。这是一种糟糕的做法,因为开发人员会期望枚举及其关联值是常量,但您仍然可以在具有 getter 和 setter 的枚举中定义非最终字段。
这是合法的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);
}
}
在您的情况下,这非常简单:您只需要一个字符串类型的字段(不可变),因此在构造函数中对其进行初始化并提供一个 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; }
}
关于java - 如何定义枚举项的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3054247/
我是一名优秀的程序员,十分优秀!