2013-01-10 52 views
12

所以我看了看周围的谷歌和SO,我无法找到一个例子或解释:enumstaticfinal方法的目的是什么?enum中的静态最终方法

我明白了什么:

  1. 方法声明static可以像函数/程序语言来访问。
  2. final意味着你不能覆盖它。无法更改参考。正如assylias指出的,评论static也不能被覆盖。
  3. enum s不能被分类,解释here

那么,有什么的staticfinal方法enum S中的点,如果它永远不会被覆盖因为不会有一个子类?

+4

静态方法在任何情况下都不能被覆盖... – assylias

+0

@Henry静态方法也不能被覆盖。 – biziclop

+0

@ assylias我应该在第二点加上。 – wtsang02

回答

17

通过制定最终的静态方法,you prevent it from being hidden(只有实例方法可以被子类覆盖)。

由于枚举不能被子类化,所以静态方法的最终是多余的,但不禁止。

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

+1

+1实际上有些情况下Enum可以被子类化,例如'enum SomeEnum {VALUE1 {},VALUE2 {};}'VALUE1 {}是SomeEnum类型的匿名类,但是由于我们不能使用静态方法将静态方法添加到非静态内部类(如匿名类)最后'与'静态'这里是矫枉过正。 – Pshemo

+0

@Pshemo这是一个好点 - 我编辑了我的答案并添加了参考。 – assylias

4

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

final这里没有任何用处,除了可能使代码更容易阅读,但不是太多。

它类似于interface方法通常写为public void foo();,即使接口成员总是公开的。

0

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

+1

您不能添加静态方法来枚举常量。 – assylias

2

在Java中枚举类型用于表示固定的一组常量并使其成为static final只有一次帮助其初始化,单个副本在所有实例之间共享,访问具有类名称的变量并且最终它更像一个只读