【问题标题】:static final methods in enum枚举中的静态最终方法
【发布时间】:2013-01-10 18:52:51
【问题描述】:

所以我环顾了谷歌和 SO,我找不到示例或解释:staticfinalenum 中的方法的目的是什么?

我的理解:

  1. 方法声明 static 可以像函数/过程语言一样访问。
  2. final 表示您不能覆盖它。无法更改参考。正如 assylias 在 cmets static 中指出的那样,也不能被覆盖。
  3. enums 不能被子类化,解释here

那么,enums 中的static final 方法如果永远不会被覆盖,那又有什么意义呢?因为不会有子类?

【问题讨论】:

  • 静态方法无论如何都不能被覆盖...
  • @Henry 静态方法也不能被覆盖。
  • @assylias 我应该在第二点添加。
  • 所以我认为你的问题是真的" "在任何枚举方法上使用final 修饰符有什么用处,无论是否是静态的?"

标签: java oop enums


【解决方案1】:

通过将静态方法设为final,you prevent it from being hidden(仅实例方法可以被子类覆盖)。

由于 enum 不能被子类化,因此将静态方法设为 final 是多余的,但并非禁止。

注意:从技术上讲,每个具有类主体 implicitly defines an anonymous class that extends the enum 的枚举常量。但是自从inner classes may not declare static methods之后,静态final方法就不能隐藏在这样一个常量的类体中了。

【讨论】:

  • +1 实际上存在 Enum 可以被子类化的情况,例如 enum SomeEnum { VALUE1{}, VALUE2{}; }VALUE1{} 是 SomeEnum 类型的匿名类。但是由于我们不能使用finalstatic 将静态方法添加到非静态内部类(如匿名类)中,所以这里是矫枉过正。
  • @Pshemo 这是一个很好的观点 - 我已经编辑了我的答案并添加了参考。
【解决方案2】:

很容易看出为什么static 方法有意义,所以我猜问题是关于final 修饰符。

final 在这里没有任何作用,除了可能使代码更易于阅读,但不会太多。

这类似于interface 方法通常写成public void foo();,尽管接口成员始终是公共的。

【讨论】:

    【解决方案3】:

    在 Java 中,枚举类型用于表示一组固定的常量,并将其设置为 static final 仅有助于其初始化一次,单个副本在所有实例之间共享,使用类名访问变量,使用 final 更像是读取-仅

    【讨论】:

      【解决方案4】:

      当您声明枚举的实例时,您可以覆盖枚举的方法,本质上枚举实例被实现为(或被认为)为子类。 static 方法在任何情况下都不能被覆盖,但 OP 和其他答案中暗示 final 对于 enum 是多余的是错误的。

      【讨论】:

      • 不能给枚举常量添加静态方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多