枚举是否允许在Java中使用setter?

时间:2013-03-08 19:54:13

标签: java enums

问题已经回答了。谢谢你们。

我有一个枚举,它有参数字符串。 我可以为这些变量设置制定者吗?

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;
}

6 个答案:

答案 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;
    }
}

http://ideone.com/QAZHol

但是,通常不建议在枚举中使用可变状态。

答案 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;

在更复杂的情况下,例如增量或其他情况(对于枚举,可能性很小,但是...谁知道,枚举设置器本身就是一种奇特的东西),其他并发性武器,例如Atomicsynchronized块,可能需要Lock

还有a discussion on enum thread safety