【问题标题】:Why Java don't force to use final with enum properties为什么 Java 不强制将 final 与枚举属性一起使用
【发布时间】:2020-08-22 04:50:20
【问题描述】:

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

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 不使用 finalfinal int index 就像 Java 对待接口的属性一样。谁能解释一下?

【问题讨论】:

  • 一个 property 在 Java 中由它的 getter/setter 定义。接口根本不能有instance fields;它们只能有常量。
  • 使所有枚举字段final 会阻止我们做的一件事是enum singletons,尽管我不认为这是一个太大的问题。我们仍然可以用类编写单例。

标签: java enums final


【解决方案1】:

诸如“为什么 Java 不强制将 final 用于 enum 属性”之类的问题只有一个正确答案:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    使用 final 是最佳实践,但(不幸的是)编译器并未强制执行。

    本教程 (https://www.baeldung.com/java-enum-values) 陈述如下:

    “我们的标签字段是最终的。虽然枚举的字段不必是最终的,但在大多数情况下,我们不希望我们的标签改变。本着枚举值不变的精神,这是有道理的。 "

    【讨论】:

    • 请花时间阅读:"No Best Practices"
    • @StephenC 有趣的阅读。我想在用大写字母命名所有变量时可以参考这篇文章;)
    • 你没有抓住重点。命名变量是关于是否遵循样式指南约定......不是(所谓的)“最佳实践”。 (我可以为您提供遵循这些约定不是正确做法的场景......证明它们不是“最佳实践”。)
    • 重点是在计算机科学/计算机编程/软件工程领域几乎没有真正最佳实践。
    • @StephenC 对不起。我认为我的评论与我的预期不同。我只是讨厌迂腐:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2010-09-23
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多