让我们看看我的枚举定义:
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一样,处理接口的属性。有人能解释吗?
2条答案
按热度按时间bnlyeluc1#
最好的做法是使用final,但(不幸的是)编译器没有强制使用final。
本教程(https://www.baeldung.com/java-enum-values)声明如下:
“我们的标签字段是最终的。虽然枚举的字段不必是final,但在大多数情况下,我们不希望更改标签。在枚举值保持不变的精神下,这是有意义的。”
hk8txs482#
像“为什么java不强制使用
final
为了enum
“属性”只有一个正确答案:因为java设计者并不是这样设计的。
我们只能猜测他们为什么不这样设计。真正知道真正原因的人只有设计师自己。很有可能,即使是他们也无法记住自己决策的所有细节(从理论上讲,在某个人的文件柜的底部可能还有设计会议的会议记录,但我们无法访问这些会议记录。。。现在。
我的推测是,设计师会想到一些合理的用例,其中
enum
具有可变属性的值将非常有用。正如@sweeper所指出的,enum
-基于web的单例设计模式实现就是这样一个用例。甚至@aeberhart在回答中引用的例子也可以用另一种方式来解读:当一个
enum
不必是final
,在大多数情况下,我们不希望我们的标签改变。这意味着在少数情况下,他们可能希望标签发生变化。这是不要求
label
示例中的字段(以及一般字段)始终为final
... 在语言层面。概括地说,程序语言设计不支持(或禁止)构造和使用模式并不是一件好事,因为设计者不喜欢它。或者仅仅因为某些(所谓的)Maven认可它们为“最佳实践”。