为什么java不强制对enum属性使用final

13z8s7eq  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(790)

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

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不使用 final 为了 final int index 就像java一样,处理接口的属性。有人能解释吗?

bnlyeluc

bnlyeluc1#

最好的做法是使用final,但(不幸的是)编译器没有强制使用final。
本教程(https://www.baeldung.com/java-enum-values)声明如下:
“我们的标签字段是最终的。虽然枚举的字段不必是final,但在大多数情况下,我们不希望更改标签。在枚举值保持不变的精神下,这是有意义的。”

hk8txs48

hk8txs482#

像“为什么java不强制使用 final 为了 enum “属性”只有一个正确答案:
因为java设计者并不是这样设计的。
我们只能猜测他们为什么不这样设计。真正知道真正原因的人只有设计师自己。很有可能,即使是他们也无法记住自己决策的所有细节(从理论上讲,在某个人的文件柜的底部可能还有设计会议的会议记录,但我们无法访问这些会议记录。。。现在。
我的推测是,设计师会想到一些合理的用例,其中 enum 具有可变属性的值将非常有用。正如@sweeper所指出的, enum -基于web的单例设计模式实现就是这样一个用例。甚至@aeberhart在回答中引用的例子也可以用另一种方式来解读:
当一个 enum 不必是 final ,在大多数情况下,我们不希望我们的标签改变。
这意味着在少数情况下,他们可能希望标签发生变化。这是不要求 label 示例中的字段(以及一般字段)始终为 final ... 在语言层面。
概括地说,程序语言设计不支持(或禁止)构造和使用模式并不是一件好事,因为设计者不喜欢它。或者仅仅因为某些(所谓的)Maven认可它们为“最佳实践”。

相关问题