2010-01-16 91 views
19

在Java中使用類似於類的枚舉有什麼好處,而不僅僅是像C/C++中那樣的常量集合?Java中的枚舉。優點?

+0

檢查http://stackoverflow.com/questions/1419835/understanding-enums-in-java/1419849#1419849 – Narayan 2010-01-16 14:46:10

回答

24

您可以免費獲得編譯時有效值的檢查。使用

public static int OPTION_ONE = 0; 
public static int OPTION_TWO = 1; 

不保證

void selectOption(int option) { 
... 
} 

將只接受0或1作爲參數值。使用枚舉,這是有保證的。此外,這導致更多的自我記錄代碼,因爲您可以使用代碼完成來查看所有枚舉值。

+0

這個答案擊中的主要優勢,但它忽略了其他答案中詳述的其他幾個優點。 – DJClayworth 2011-02-14 14:36:55

4

枚舉已經是class in Java

如果你問爲什麼這是更好的,我會說,更好的類型安全性和能力增加其他屬性,除了單純的序號值會浮現在腦海中。

0

枚舉是一種本身 - 你不能用一個不存在的枚舉,或把一些其他類似的期待不變。還可以枚舉它們,以便代碼更加簡潔。

使用靜態常量可能會導致maintenence噩夢 - 特別是如果他們區域上展開。

11

類型安全是其中一個原因。

另外,that I find more important,是你可以將元數據在Java中的枚舉值。例如,你可以使用一個枚舉來定義一組法律操作的Web服務,然後附加元數據請求和數據類的類型:

AddItem(HttpMethod.POST, ProductEntry.class), 
+2

請注意這一點。我經常看到人們用屬性而不是類來使用枚舉。這可能會導致周圍的代碼使用枚舉非常奇怪和靜態(有效地試圖將對象注入枚舉),因爲它們非常熱衷於保持枚舉,而不是將所述枚舉轉換爲合適的類,並重構命中。 – DaveC 2010-01-16 18:15:43

+1

這似乎很漂亮的病態;希望看到一個例子。所以也許有些規則是按順序的:沒有可變狀態,也沒有行爲。 – kdgregory 2010-01-17 13:07:44

3

除了更好的類型安全,你也可以定義您的枚舉中的自定義行爲(請參閱Effective Java以獲得一些很好的示例)。

1

使得枚舉,它可以包含固定的常數集的引用類型導致了高效地圖實現像 EnumMap的設置實現像 EnumSet(JDK類)。

從EnumMap的javadoc的的:
與枚舉類型鍵一起使用的專用Map實現。枚舉映射中的所有鍵必須來自單個枚舉類型,該映射在創建映射時明確或隱含地指定。枚舉映射在內部表示爲數組。這種表示非常緊湊和高效。

EnumMap結合了Map的豐富性和類型安全性以及數組的速度(Effective Java)。

0

唯一real的優點是它可以用在switch聲明中。所有其他的東西枚舉能夠正好可以用普通的香草類完成了private構造,其實例又被聲明爲有問題的類public static final字段(類型安全模式)。枚舉的另一個好處顯然在於它使得代碼不像使用普通的香草類那樣冗長。

但是如果我沒有弄錯,在C++中(或者是C#?),您可以在switch語句中使用String。因此,與C++相比,Java中的枚舉優勢可以忽略不計。然而,Java 7也提出了同樣的問題,不知道它是否會成功。

6

Java 5的枚舉源自類型安全枚舉圖案從Joshua BlochEffective Java(第一版),以避免在C/C++/C#枚舉的缺陷(它們是簡單地薄-隱晦INT常量)和在Java中使用最終的靜態int常量。

主要是int常量和int枚舉不是類型安全的。你可以傳入任何int值。在C/C++,你可以這樣做:

enum A { one, two, three }; 
enum B { beef, chicken, pork } b = beef; 

void func(A a) { ... } 
func((A)b); 

不幸的是,從有效的Java類型安全枚舉模式有很多的樣板,但並非所有的很明顯。最值得注意的是,你不得不重寫私人方法readResolve停止使用Java創建的反序列化的新實例,這將打破簡單的參考檢查(使用而不是equals()==運營商)。

所以Java 5枚舉了整數提供這些優勢:

  • 類型安全;
  • Java 5枚舉可以有行爲和實現接口;
  • 的Java 5枚舉有像EnumSetEnumMap一些非常輕量級的數據結構。

Java 5個的枚舉過這些優點在剛剛使用類:

  • 不易出錯樣板(私有構造函數,readResolve()等);
  • 語義正確性。你看到的東西是一個枚舉,你知道它只是代表一個值。你看到一堂課,但你不確定。也許在某個地方有一個靜態工廠方法,等等.Java 5枚舉更清楚地表明瞭意圖。
+0

重寫'readResolve()'並不重要。我經常爲有限數量的實例做類。有時'enum'會簡化這些類的定義,有時不會。使用正確的工具來完成這項工作。 – finnw 2010-01-17 02:29:55

2

您可以使用枚舉有效落實單身^^:使用枚舉的

public enum Elvis { 
    INSTANCE 
} 
+1

-1 - 你應該避免單身人士,沒有辦法「有效地實施」他們(這種方法,順便說一句,加載時初始化,這是非常痛苦的調試) – kdgregory 2010-01-17 14:38:01

+1

我只是想指出,如果你需要/想要使用Singletons,這是Java中最好的方法 – helpermethod 2010-01-17 17:26:17

+9

順便說一句,單身人士DO有他們的用途 – helpermethod 2010-01-17 17:28:42

0

優點: 對象可以創建以相同的方式工作,因爲枚舉。實際上,直到5.0版本之前,甚至還沒有將Java枚舉中的 枚舉包含在內。但是,枚舉使代碼更具可讀性,並且爲程序員錯誤提供了更少的空間。

OCA Java SE 7中編程我學習指南