10

I have an enum and it has a parameter (field) that is a String. Am I allowed to have a setter for this field?

public enum Blah {
    Monday("a"), Tuesday("b");
}

private final String letter;

Blah(String letter){
    this.letter = letter;
}

Am I allowed to do the following?

public String setLetter(String letter){
    this.letter = letter;
}
4

6 回答 6

11

您需要删除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

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

于 2013-03-08T20:08:26.100 回答
5

更新:枚举类型中可能有设置器。

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
}

}

于 2016-04-01T09:21:57.783 回答
4

这不起作用,因为该字段被标记为final.

原则上,没有什么可以阻止枚举具有可变字段。然而,这很少是一个好主意。

于 2013-03-08T20:08:19.630 回答
2

允许,但是,如果您要在多线程环境中使用枚举,请不要忘记,尽管 Java 枚举,实际上是一个延迟初始化的单例,在延迟初始化期间由 Java 保护(这意味着没有任何其他线程可以访问枚举,直到初始化线程尚未完成初始化),无论如何都不能防止 setter 的并发使用

volatile因此,在 OP 的简单设置器的情况下,将可变字段声明为(当然删除)就足够了final

volatile int letter;

在更复杂的情况下,例如增量或其他情况(使用枚举几乎不可能,但是......谁知道,枚举设置器本身就是一种奇特的东西)可能需要其他并发武器,如Atomics、synchronizedblocks、 s。Lock

此外,还有一个关于枚举线程安全的讨论

于 2019-10-09T16:19:44.900 回答
1

在使用过程中Enums,将变量声明为final.
由于在上面的示例中没有这样做,我们可以将值设置为其他值。

根据定义:
Enums就像任何其他类一样,具有预定义的NonChanging/FIXED实例集。

于 2017-08-14T20:11:02.103 回答
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
        }
}
于 2013-03-09T12:17:49.487 回答