首页 > 解决方案 > 为什么 Java 不强制将 final 与枚举属性一起使用

问题描述

让我们看一下我的枚举定义:

public enum Day {
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3);

    int index;

    Day(int i) {
        index = i;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public static void main(String[] args) {
        Day x = MONDAY;
        Day y = MONDAY;
        x.setIndex(2);
        System.out.println(y.index);  // Ouput: 2
    }

一般来说,我知道我们不应该实现这样的代码。为了防止这种情况,为什么 java 不使用finalfor final int indexlike Java 对待接口的属性。有谁能解释一下吗?

标签: javaenumsfinal

解决方案


“为什么 Java 不强制使用finalforenum属性”之类的问题只有一个正确答案:

因为 Java 设计者不是那样设计的。

我们只能推测他们为什么不这样设计。真正知道真正原因的只有设计师自己。甚至他们也有可能无法记住他们决策的所有细节。(我做不到。)理论上,在某人的文件柜底部仍然可以保留设计会议记录,但我们现在无法访问它们。

我的猜测是,设计人员会想到合理的用例,其中enum具有可变属性的值会很有用。正如@Sweeper 指出的那样,enum基于 - 的单例设计模式实现就是这样一种用例。甚至@aeberhart 在他的回答中引用的例子也可以用另一种方式阅读:

虽然 an 的字段enum不必是final,但在大多数情况下,我们不希望我们的标签发生变化。

意味着在少数情况下,他们可能希望更改标签。这是不要求label示例中的字段(以及一般字段)始终是final……在语言级别的一个论点。

概括地说,对于程序语言设计来说,仅仅因为设计者不喜欢它而不支持(或禁止)构造和使用模式并不是一件好事。或者只是因为某些(所谓的)专家认可它们为“最佳实践”。


推荐阅读