簡體   English   中英

什么時候在 Java 中使用 Enum 類?

[英]When to use Enum class in java?

這可能是非常明顯的問題,但是如果您知道值列表會不斷增加,是否可以使用 Enum 類?

假設您首先定義了一個事件枚舉,它只包含 [Poo, Too],然后我們知道我們總是有一些新的需求,它變成 [Poo, Too, App, Laa] 並且不斷變化,

那么在這種情況下最好的方法是什么?

tl;博士

  • 如果在編譯時已知整組可能值,請使用 enum
  • 如果可以在系統使用中(運行時)添加或刪除值,則不能使用 enum 請改用SetListMap

編譯時已知

當域(所有可能值的集合)在編譯時已知時,枚舉是合適的。

如果今年您的公司提供兩種產品( Poo 和 Too ),則為這兩個元素進行枚舉。

public enum Product { POO , TOO }

明年,您的公司決定通過添加 App & Laa 來增加他們的產品供應。 作為計划部署的一部分,將另外兩個對象添加到您的枚舉中。

public enum Product { POO , TOO , APP , LAA }

順便說一下,請注意命名約定。 枚舉有一個常規的類名(初始上限)。 被自動實例化的對象是常量,因此以全大寫命名。

另外,請注意 Java 中的枚舉功能非常靈活和強大,比大多數語言中常見的命名數字枚舉方案要強大得多。 您可以在 Java 枚舉上擁有成員變量、方法和構造函數。 例如,您可以添加一個getDisplayName方法來提供比全大寫對象名稱更適合用戶界面的文本,如DayOfWeek::getDisplayName 您可以添加相當多的功能,例如ChronoUnit.between

在運行時使用 Java 中的枚舉不能做的是添加或刪除對象。 因此要求您在編譯時了解您的域。 但是,在處理一組枚舉對象時,您可以使用高度優化的EnumSetEnumMap類。

運行時已知

如果您不能確定在編譯時域,如果用戶可以添加或刪除運行時的元素,然后使用一個集合,如ListSet ,或Map ,而不是一個枚舉。


單身人士

雖然最初不是作為 Java 中Enum的目的,但 enum 恰好是實現單例設計模式的最安全(也是最簡單)的方式。

Joshua Bloch 博士等人在著名的Effective Java一書中解釋了這種處理單例的方法。 使用枚舉可以通過其他方法解決單例的多個晦澀的技術問題。

你的問題很籠統,我很確定沒有單一的正確答案。 但是根據 spring* 標簽判斷,我想您可能會詢問 DTO 中以序列化形式通過您的系統發送的枚舉。 如果是這種情況,我建議在 DTO 中選擇String ,而在單個應用程序中使用enum 然后,您將只關心以工廠方式進行反序列化/轉換,能夠通過記錄/提供回退或有意義的錯誤來優雅地處理未知/丟失的常量。

這取決於具體情況,您的問題沒有太多上下文。 但是,我確實建議在許多情況下使用 ENUM,包括如果您希望 ENUM 列表增加。

使用它們的一些原因是:

  1. 它創建了可在整個代碼中使用的 ENUM 元素的明確指南。 它消除了對某物的名稱或它是什么的不確定性。 例如包含動物列表的 ENUM,或“某物”的枚舉。
  2. 如果您需要更改任何內容,以后很容易重構。

我敢肯定還有更多原因,有時我覺得它就像一個目錄。 在許多情況下,您可以完全避免它並且很好,但我認為如果您處於圍欄狀態,通常最好使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM