Java是否存在可变性用例和可能性?

Seb*_*ber 9 java enums spring

我不知道我是否是唯一知道这一点的人,但是枚举的值不是隐含的最终值,可以修改.

  enum EnumTest {
    TOTO("TOTO 1"),
    TATA("TATA 2"),
    ;

    private String str;

    private EnumTest(String str) {
      this.str = str;
    }

    @Override
    public String toString() {
      return str;
    }
  }

  public static void main(String[] args) {
    System.out.println(EnumTest.TATA);
    EnumTest.TATA.str = "newVal";
    System.out.println(EnumTest.TATA);
  }

TATA 2
newVal
Run Code Online (Sandbox Code Playgroud)

这些值通常在实例创建(TOTO("TOTO 1"))时初始化,但除了我自己之外,我从未见过有人使用final关键字来表示应该是不可变的枚举变量.这不是问题的关键,只是想知道我是否是唯一意识到这一点的人.


我想知道的是,是否有任何用例来创建可变的枚举?

而且我也想知道我们可以用枚举做的限制(良好做法与否).我没有测试它,但也许枚举可以注入Spring bean?至少看起来我们可以注释每个实例(@Deprecated可以正常工作),以及方法.

Paŭ*_*ann 8

一个可能的用例是延迟初始化(在首次使用时计算一些字段值,如果通常根本不使用它们),或者是"普通"可变单例对象(如注册表等).

但是,在大多数情况下,枚举对象应该是不可变的,并且它们的字段是最终的.


Ale*_*x D 7

虽然你在这里指出一个有趣的事实,但就我而言,可变枚举字段没有用处.有很多原因可以解释为什么使用这种语言"功能"("bug"?)会是一个坏主意,尤其是其他开发人员混淆的可能性.

  • 我同意,通常认为枚举是不可变的,因此创建可变的枚举可能导致滥用.我建议与枚举相关的可变值最有助于"EnumMap".也就是说,我认为说"没有用例"太强大了.实践中的枚举代表了单元模式的扩展(固定数量的实例),并且考虑到这一点可以像任何其他类一样使用.我再次重申,MOST开发人员习惯将它们视为无法实现,因此可变的枚举可能会导致维护问题. (4认同)