2013-01-10 86 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只有一次幫助其初始化,單個副本在所有實例之間共享,訪問具有類名稱的變量並且最終它更像一個只讀