2012-07-20 144 views
37

我有一個場景,我有玩家類型ARCHER,WARRIOR和巫師。我應該在玩家類中使用什麼?一個字符串變量的類型或一個枚舉?爲什麼枚舉和爲什麼常量字符串。請原諒。爲什麼要使用枚舉而不是常量?

+1

我不會使用一個字符串變量。如果有的話,一個'int'變量(用各種類型命名的常量)。 – Thilo 2012-07-20 08:13:14

+3

這個答案對你有好處嗎? http://stackoverflow.com/questions/613837/enums-and-constants-which-to-use-when?rq=1 – Jimmy 2012-07-20 08:13:30

+0

可能重複[什麼是枚舉有用嗎?](http://stackoverflow.com/問題/ 11393389/what-is-enum-useful-for) – oers 2012-07-20 08:27:32

回答

73

假設你使用的字符串常量(或int值 - 同樣也適用於他們):

// Constants for player types 
public static final String ARCHER = "Archer"; 
public static final String WARRIOR = "Warrior"; 

// Constants for genders 
public static final String MALE = "Male"; 
public static final String FEMALE = "Female"; 

,那麼你最終沒有真正瞭解你的數據的類型 - 導致潛在的不正確的代碼:

String playerType = Constants.MALE; 

如果您使用枚舉,這將最終成爲:

// Compile-time error - incompatible types! 
PlayerType playerType = Gender.MALE; 

同樣,枚舉給受限制的組值:

String playerType = "Fred"; // Hang on, that's not one we know about... 

VS

PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang! 

此外,在Java中枚舉可以有與它們相關的詳細信息,並且還可以有行爲。四周好多了。

+3

非常感謝你提供了這樣一個詳細而好的答案。 – Waqas 2012-07-20 08:19:40

+2

Enums和Constants之間的性能比較怎麼樣? – Waqas 2012-07-20 08:20:45

+0

@ waqas716:枚舉是引用類型,但每個值只有一個對象,所以你不可能浪費太多內存。如果你想要其他的性能差異,你必須說你感興趣的。 – 2012-07-20 08:27:55

8

枚舉限制你所需要的一組輸入,而即使你使用常量字符串你仍然可以使用其他字符串不是你的邏輯的一部分。

這可以幫助你不犯錯誤,進入出來的東西域,在輸入數據和也提高了程序的可讀性。

此外,你可以隨時使用你的枚舉作爲一個字符串,如果你的願望。這是一個reference

1

我會建議你使用枚舉只有當你真正需要的枚舉常量,或者一些附加功能常見的所有項目。

取決於你正在寫什麼你想支持版本和設備應用程序的類型那是當然的。

的原因是,枚舉增加開銷,因爲他們分配他們的項目實例。你可以看到,有在android平臺上最小的枚舉,而幾乎所有的常量是最終靜態整數(如View.GONE和類似的東西)

+2

@Jon Skeet:你對此有何評論? – Waqas 2012-07-20 08:28:20

+0

有時類型安全值得「增加開銷」的成本。 – 2016-10-10 20:48:12

3

而且不會讓你提供一個不正確的值,還有另一種功能可能看起來很小的枚舉,但在我看來非常重要。現代IDE可以自動爲枚舉提供值,而無法可靠地推斷出字符串常量的可能值(Intellij IDEA執行後者,但僅適用於JDK類和常用庫)。當您正在探索新的API時,這特別有用。

0

Enum最好用於類型安全。錯誤的值不能輸入。但是android中的enum需要這麼多的內存,你應該使用intdef來代替。請參考此答案示例和說明: -

IntDef/StringDef Example

您還可以檢查Android源代碼它與IntDef/StringDef替換枚舉儘可能。防爆。 View.VISIBLE。

相關問題