2010-03-19 83 views
9

我和我的同事們正在討論enums中的邏輯。我個人的偏好是而不是在Java枚舉中有任何類型的邏輯(儘管Java提供了這種能力)。套管在此的討論圍繞着具有枚舉內的便捷方法,它返回一個地圖:enum中的邏輯

public enum PackageType { 
    Letter("01", "Letter"), 
    .. 
    .. 
    Tube("02", "Packaging Tube"); 

    private String packageCode; 
    private String packageDescription; 

    .. 
    .. 

    public static Map<String, String> toMap() { 
    Map<String, String> map = new LinkedHashMap<String, String>(); 
    for(PackageType packageType : PackageType.values()) { 
     map.put(packageType.getPackageCode(), packageType.getPackageDescription()); 
    } 
    return map; 
    } 
} 

我個人的偏好是拉了這一點到服務。將enum中的方法放在方便性中的論點。這個想法是,你不需要去獲得它的服務,但可以直接查詢枚舉。

我的觀點主要集中在關注點分離和將任何類型的邏輯抽象爲服務。我不認爲「便利」是把這種方法放入枚舉中的有力論據。

從最佳實踐的角度來看,哪一個更好?或者它只是歸結爲個人偏好和代碼風格的問題?

+2

如果字符串是最終的,考慮在靜態初始化時間創建一個不可變的映射,而不是在每次有人調用映射時滾動一個映射() – 2010-03-19 00:28:08

回答

13

那麼,我之前做過這件事,但這並不意味着它是最好的。

但是從我的角度來看,我寧願在enum上有這樣的邏輯,出於同樣的原因,您不會將'toString'方法移出服務。邏輯只涉及枚舉本身和它自己的表示。

我認爲將這樣的方法轉移到服務中會產生誤導 - 通過將它放在枚舉中的枚舉上,該枚舉具有「toMap」方法。有人不知道該服務,只是看着枚舉可能不知道。

它也有助於在IDE中自動完成 - 我可以擊中'。'鍵並立即看到對象提供的方法。

2

我看不出有什麼說服力的原因,爲什麼它是「良好的做法」......或「壞習慣」......去做你的建議。

我傾向於爲了方便的參數去。但坦率地說,這不是那種花費人日辯論 ...... IMO的生產力。

+4

午餐討論:) – 2010-03-19 00:17:40

+0

我正要發表評論說'它可能在午餐「 – 2010-03-19 00:17:59

+0

嗯... * *吃你的午餐更有趣...... IMO :-) – 2016-09-22 07:21:22

3

我認爲這可能歸結爲個人偏好以及您是否認爲未來的邏輯可能會發生變化。

枚舉邏輯的最佳用例(因爲它非常靜態)適用於不會改變的事物。 java.util.concurrent.TimeUnit中的邏輯就是一個很好的例子:時間單元之間的轉換因子是明確定義的,並且不會改變,因此嵌入在枚舉中的靜態邏輯非常適合。

0

我在枚舉試圖邏輯幾次,但我曾經真的很高興的唯一的事情是一樣的東西:

// not compiled, so might have errors... 
public enum Foo 
{ 
    A, 
    B; 

    // not complete, doesn't properly handle invalid cases... 
    public static Foo fromString(final String str) 
    { 
     final String strLower; 
     final Foo val; 

     strLower = str.toLowerCase(); 

     if(strLower.equals("a") 
     { 
      val = A; 
     } 
     else if(strLower.equals("b") 
     { 
      val = B; 
     } 
     else 
     { 
      throw new IllegalArgumentException(/*...*/); 
     } 

     return (val); 
    } 
} 

一般來說,一旦你開始添加實例變量/方法,你可能應該做的事情有適當的課程。

0

我會先把它放入枚舉中。如果系統中只有一個toMap()方法,那麼擁有額外的類肯定是​​不必要的,而且會很煩人。

如果我有一堆從中我想創建這樣的地圖,也許預料這樣的情況枚舉的,然後我會創建一個靜態實用工具類和泛型實用方法做到這一點。

我個人的看法是,實用性流浪漢理論。

編輯:哦,等等,這將是很難提供一個通用的實用方法..在這種情況下,如果該方法將是具體的枚舉,我一定會把它放在枚舉。如果我是維護程序員,如果您需要額外的課程,我會非常不滿意。

+0

如果您使用的策略,以確定哪些投入它變得微不足道的地圖,但添加依賴到一個枚舉另一個接口/這種類型的虐待。 如果我是一個維護程序員,我會很高興間接的額外級別,任何有助於解決這些邊緣情況和特殊情況是突然出現總是有益的。如果他們從來沒有需要,我從來沒有注意到/關心。 – vickirk 2010-03-19 01:06:57

0

任何事情一樣,將取決於使用情況,也有一般規則,但實用性應該總是贏得爭論。什麼是地圖用於?您是否需要限制地圖的內容,例如如果地圖用於填充組合框,是否需要刪除一些選擇,例如,如果某些運營商只處理某些包類型,則可以使用策略來填充地圖,這最好在枚舉之外完成。

儘管如此,我更傾向於將有一個創建地圖的其他地方,也間接的額外水平從來都不是障礙靈活性,可以節省很多痛苦,現在增加了小的開銷。你也可以對它進行編碼,這樣你就可以獲得與其他枚舉類似的功能。