问题已经回答了。谢谢你们。
我有一个枚举,它有参数字符串。 我可以为这些变量设置制定者吗?
public enum Blah {
Monday("a"), Tuesday("b");
}
private final String letter;
Blah(String letter){
this.letter = letter;
}
我被允许这样做:
public String setLetter(String letter){
this.letter = letter;
}
答案 0 :(得分:10)
您需要删除字段的final
修饰符才能设置它:
public enum Blah {
Monday("a"), Tuesday("b");
private String letter;
private Blah(String letter){
this.letter = letter;
}
public void setLetter(String letter){
this.letter = letter;
}
}
但是,通常不建议在枚举中使用可变状态。
答案 1 :(得分:3)
更新:可以在枚举类型中设置setter。
public class Main {
public enum Account {
ACCOUNT("NAME");
private String name;
private Account(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) {
System.out.println(Account.ACCOUNT.getName()); // print NAME
Account.ACCOUNT.setName("NEW");
System.out.println(Account.ACCOUNT.getName()); // print NEW
}
}
答案 2 :(得分:2)
这不起作用,因为该字段标记为final
。
原则上,没有任何东西阻止枚举产生可变字段。然而,这很少是一个好主意。
答案 3 :(得分:0)
public class EnumExample {
public enum Blah {
Monday("a"), Tuesday("b");
private String letter;
private Blah(String letter){
this.letter = letter;
}
public void setLetter(String letter){
this.letter = letter;
}
public String getLetter(){
return letter;
}
}
public static void main (String[] args) {
System.out.println("The Value of Monday is "+ Blah.Monday.getLetter());//prints a
System.out.println("The Value of Tuesday is "+Blah.Tuesday.getLetter());//prints b
}
}
答案 4 :(得分:0)
在枚举中,将变量声明为final是一个好主意。由于在上面的示例中没有完成,我们可以将值设置为其他值。
答案 5 :(得分:0)
允许,但是,如果要在多线程环境中使用枚举,请不要忘记,尽管Java枚举实际上是惰性初始化的单例, 在延迟初始化期间由Java保护 (这意味着在初始化线程尚未完成初始化之前,任何其他线程都无法访问该枚举), 无论如何都不能防止同时使用设置器。
因此,在OP的简单设置方法中,将可变字段声明为volatile
(当然,删除final
即可):
volatile int letter;
在更复杂的情况下,例如增量或其他情况(对于枚举,可能性很小,但是...谁知道,枚举设置器本身就是一种奇特的东西),其他并发性武器,例如Atomic
,synchronized
块,可能需要Lock
。