java - 为什么 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 不使用final
for final int index
like Java 对待接口的属性。有谁能解释一下吗?
解决方案
“为什么 Java 不强制使用final
forenum
属性”之类的问题只有一个正确答案:
因为 Java 设计者不是那样设计的。
我们只能推测他们为什么不这样设计。真正知道真正原因的只有设计师自己。甚至他们也有可能无法记住他们决策的所有细节。(我做不到。)理论上,在某人的文件柜底部仍然可以保留设计会议记录,但我们现在无法访问它们。
我的猜测是,设计人员会想到合理的用例,其中enum
具有可变属性的值会很有用。正如@Sweeper 指出的那样,enum
基于 - 的单例设计模式实现就是这样一种用例。甚至@aeberhart 在他的回答中引用的例子也可以用另一种方式阅读:
虽然 an 的字段
enum
不必是final
,但在大多数情况下,我们不希望我们的标签发生变化。
意味着在少数情况下,他们可能希望更改标签。这是不要求label
示例中的字段(以及一般字段)始终是final
……在语言级别的一个论点。
概括地说,对于程序语言设计来说,仅仅因为设计者不喜欢它而不支持(或禁止)构造和使用模式并不是一件好事。或者只是因为某些(所谓的)专家认可它们为“最佳实践”。
推荐阅读
- php - 添加嵌套循环后,laravel id 值发生了变化
- mongodb - 带有 Neo4J 和 MongoDB 的 Spring Boot 项目
- python - Tkinter Multiprocessing Namerror:未定义名称'logarea'
- python - python中的“超级”数字
- mqtt - Mosquitto bridge broker, connection refused after connecting
- django - 在 django 的简单查询中使用 select_related
- python - 如何使用熊猫从 csv 行创建嵌套数组?
- javascript - 在对象数组中按键获取元素
- reactjs - 无法为从 firebase 数据库中获取的项目分配 id
- python - 姜戈芹菜。如何在准确的时间运行任务?