我有一個場景,我有玩家類型ARCHER,WARRIOR和巫師。我應該在玩家類中使用什麼?一個字符串變量的類型或一個枚舉?爲什麼枚舉和爲什麼常量字符串。請原諒。爲什麼要使用枚舉而不是常量?
回答
假設你使用的字符串常量(或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中枚舉可以有與它們相關的詳細信息,並且還可以有行爲。四周好多了。
枚舉限制你所需要的一組輸入,而即使你使用常量字符串你仍然可以使用其他字符串不是你的邏輯的一部分。
這可以幫助你不犯錯誤,進入出來的東西域,在輸入數據和也提高了程序的可讀性。
此外,你可以隨時使用你的枚舉作爲一個字符串,如果你的願望。這是一個reference。
我會建議你使用枚舉只有當你真正需要的枚舉常量,或者一些附加功能常見的所有項目。
取決於你正在寫什麼你想支持版本和設備應用程序的類型那是當然的。
的原因是,枚舉增加開銷,因爲他們分配他們的項目實例。你可以看到,有在android平臺上最小的枚舉,而幾乎所有的常量是最終靜態整數(如View.GONE和類似的東西)
@Jon Skeet:你對此有何評論? – Waqas 2012-07-20 08:28:20
有時類型安全值得「增加開銷」的成本。 – 2016-10-10 20:48:12
而且不會讓你提供一個不正確的值,還有另一種功能可能看起來很小的枚舉,但在我看來非常重要。現代IDE可以自動爲枚舉提供值,而無法可靠地推斷出字符串常量的可能值(Intellij IDEA執行後者,但僅適用於JDK類和常用庫)。當您正在探索新的API時,這特別有用。
Enum最好用於類型安全。錯誤的值不能輸入。但是android中的enum需要這麼多的內存,你應該使用intdef來代替。請參考此答案示例和說明: -
IntDef/StringDef Example
您還可以檢查Android源代碼它與IntDef/StringDef替換枚舉儘可能。防爆。 View.VISIBLE。
- 1. 爲什麼枚舉編譯爲常量而不是靜態值?
- 2. 爲什麼Phobos使用枚舉常量?
- 3. 爲什麼使用枚舉而不是帶有靜態常量的類?
- 4. 爲什麼使用字符串常量與枚舉常量?
- 5. 的Java枚舉 - 爲什麼使用的toString,而不是名稱
- 6. 爲什麼C枚舉常量需要一個名字?
- 7. 在枚舉上使用NSString常量的原因是什麼?
- 8. 爲什麼java.util.Calendar不使用枚舉?
- 9. 如果你總是用枚舉,而不是常量在Java中
- 10. 爲什麼`std :: byte`是一個枚舉類而不是類?
- 11. 爲什麼NSString編碼常量是作爲變量而不是枚舉實現的?
- 12. Java7/WatchEvent - 爲什麼它不是枚舉?
- 13. 爲什麼我不能在公共常量中使用枚舉值「需要常量表達式」
- 14. 枚舉爲int,爲什麼使用類型轉換爲int而不是Convert.ToInt32(Enum)?
- 15. 爲什麼Java枚舉常量初始化不完整?
- 16. 什麼是「枚舉」?
- 17. OpenGL爲什麼需要統一變量(而不是常量)
- 18. 枚舉常量
- 19. 要枚舉還是不枚舉?
- 20. 爲什麼Apple使用NSString對象作爲參數而不是枚舉?
- 21. 爲什麼枚舉包括可枚舉
- 22. 枚舉拋出concurrentModification異常。爲什麼?
- 23. 爲什麼我們在枚舉中寫入Integer而不是int?
- 24. 在Java中,爲什麼可以用另一個枚舉常量限定枚舉常量?
- 25. 使用枚舉而不是外鍵
- 26. 爲什麼JPA枚舉不起作用?
- 27. 爲什麼BCL集合使用結構枚舉器而不是類?
- 28. 分配一個InvalidValue以枚舉變量(這是爲什麼不拋出異常?)
- 29. 爲什麼使用靜態枚舉?
- 30. PropertyInfo.GetValue返回枚舉常量的名稱,而不是價值
我不會使用一個字符串變量。如果有的話,一個'int'變量(用各種類型命名的常量)。 – Thilo 2012-07-20 08:13:14
這個答案對你有好處嗎? http://stackoverflow.com/questions/613837/enums-and-constants-which-to-use-when?rq=1 – Jimmy 2012-07-20 08:13:30
可能重複[什麼是枚舉有用嗎?](http://stackoverflow.com/問題/ 11393389/what-is-enum-useful-for) – oers 2012-07-20 08:27:32