[英]When to use Enum class in java?
這可能是非常明顯的問題,但是如果您知道值列表會不斷增加,是否可以使用 Enum 類?
假設您首先定義了一個事件枚舉,它只包含 [Poo, Too],然后我們知道我們總是有一些新的需求,它變成 [Poo, Too, App, Laa] 並且不斷變化,
那么在這種情況下最好的方法是什么?
Set
、 List
或Map
。當域(所有可能值的集合)在編譯時已知時,枚舉是合適的。
如果今年您的公司提供兩種產品( Poo 和 Too ),則為這兩個元素進行枚舉。
public enum Product { POO , TOO }
明年,您的公司決定通過添加 App & Laa 來增加他們的產品供應。 作為計划部署的一部分,將另外兩個對象添加到您的枚舉中。
public enum Product { POO , TOO , APP , LAA }
順便說一下,請注意命名約定。 枚舉有一個常規的類名(初始上限)。 被自動實例化的對象是常量,因此以全大寫命名。
另外,請注意 Java 中的枚舉功能非常靈活和強大,比大多數語言中常見的命名數字枚舉方案要強大得多。 您可以在 Java 枚舉上擁有成員變量、方法和構造函數。 例如,您可以添加一個getDisplayName
方法來提供比全大寫對象名稱更適合用戶界面的文本,如DayOfWeek::getDisplayName
。 您可以添加相當多的功能,例如ChronoUnit.between
。
在運行時使用 Java 中的枚舉不能做的是添加或刪除對象。 因此要求您在編譯時了解您的域。 但是,在處理一組枚舉對象時,您可以使用高度優化的EnumSet
和EnumMap
類。
如果您不能確定在編譯時域,如果用戶可以添加或刪除運行時的元素,然后使用一個集合,如List
, Set
,或Map
,而不是一個枚舉。
雖然最初不是作為 Java 中Enum
的目的,但 enum 恰好是實現單例設計模式的最安全(也是最簡單)的方式。
Joshua Bloch 博士等人在著名的Effective Java一書中解釋了這種處理單例的方法。 使用枚舉可以通過其他方法解決單例的多個晦澀的技術問題。
你的問題很籠統,我很確定沒有單一的正確答案。 但是根據 spring* 標簽判斷,我想您可能會詢問 DTO 中以序列化形式通過您的系統發送的枚舉。 如果是這種情況,我建議在 DTO 中選擇String
,而在單個應用程序中使用enum
。 然后,您將只關心以工廠方式進行反序列化/轉換,能夠通過記錄/提供回退或有意義的錯誤來優雅地處理未知/丟失的常量。
這取決於具體情況,您的問題沒有太多上下文。 但是,我確實建議在許多情況下使用 ENUM,包括如果您希望 ENUM 列表增加。
使用它們的一些原因是:
我敢肯定還有更多原因,有時我覺得它就像一個目錄。 在許多情況下,您可以完全避免它並且很好,但我認為如果您處於圍欄狀態,通常最好使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.