2015-01-21 57 views
4

舉個例子,我想製作一個收銀機程序。忽略,對於緊湊的緣故,人們不會use floats for currency我的第一反應就是用線沿線的爲面值的枚舉,東西:使用enum可以使用地圖,反之亦然嗎?

private enum Currency { 
     ONE_HUNDRED(100.00f), 
       FIFTY(50.00f), 
      TWENTY(20.00f), 
       TEN(10.00f), 
       FIVE( 5.00f), 
       TWO( 2.00f), 
       ONE( 1.00f), 
     HALF_DOLLAR( 0.50f), 
      QUARTER( 0.25f), 
       DIME( 0.10f), 
      NICKEL( 0.05f), 
       PENNY( 0.01f); 

     private final float value; 

     Currency(float value) { 
      this.value = value; 
     } 

     public float getValue() { 
      return this.value; 
     } 

     @Override 
     public String toString() { 
      return this.name().replace("_", " "); 
     } 
    } 

但最後我也跟着本能,SANS深謀遠慮,和爲摩爾斯電碼轉換器做了類似的事情,有人建議我使用地圖,而不是顯式地使用Bimap。我在這個特定的場景中看到了這個集合的吸引力,但是總的來說,我想詢問是否有任何理由選擇另一個可以使用的理由?如果不是上述代碼,我是這樣做的:

Map<String, Float> currency = new LinkedHashMap<>(); 

    currency.put("One Hundred", 100.00f); 
    currency.put("Fifty", 50.00f); 
    currency.put("Twenty", 20.00f); 
    currency.put("Ten", 10.00f); 
    currency.put("Five", 5.00f); 
    currency.put("Two", 2.00f); 
    currency.put("One", 1.00f); 
    currency.put("Half Dollar", 0.50f); 
    currency.put("Quarter", 0.25f); 
    currency.put("Dime", 0.10f); 
    currency.put("Nickel", 0.05f); 
    currency.put("Penny", 0.01f); 

它會因任何原因而優越嗎?

像這樣的情況可以被利用,是否有任何性能優勢相比,還有一種更好/傳統?更易維護/適應性強?

有什麼經驗法則我可以使用,當我應該使用一個在另一個?

+0

枚舉是強類型的,可以有方法。性能是微不足道的,直到你認爲它是一個問題。 – 2015-01-21 05:46:35

+2

地圖可以改變;枚舉不能。地圖可以在運行時查找;枚舉不能(沒有反射)。地圖可以具有雙向映射;枚舉不能。枚舉很快;地圖不那麼如此。枚舉是一流的,可以有方法和變量;地圖值不能。 – 2015-01-21 05:47:29

回答

1

這裏有我喜歡的事要記住:

枚舉,最好使用(和我所知道的,只可使用的語言)來定義一組已知項目的時間提前。這有一個很好的好處,就是以一種非常可讀的方式將經常使用的「數據」作爲代碼進行處理。

在我看來,任何依賴經常使用硬編碼字符串的代碼,如果在地圖中實現像這樣的數據,就需要使用它,這樣更難以讀取和維護。這導致「魔術串」,這是一個不可避免的時候。

目前還不清楚在地圖上應該存在什麼,直到你去檢查,並且不清楚它是否可能在其他地方被修改。考慮一下,如果你的枚舉值錯了,代碼甚至不會編譯。得到一個錯誤的字符串鍵,直到很久以後你纔會注意到。

關於表現,我懷疑兩者之間有很大的差異。枚舉被視爲與對象基本相同,我認爲好處來自作爲對象的字段訪問數據而不是哈希查找。

本文不深入去,因爲我想,但可能是一個很好的起點:Memory Consumption of Java Data Types

這是很常見的做法是使用一個枚舉作爲密鑰已知的地圖,並且提供了另一種將數據與一組特定項目相關聯(而不是將它們設置爲enum上的字段)。我相信這種方法將是我的首選方法,因爲在枚舉上設置很多字段會讓他們覺得太像一個類而不是一種引用方法。這與普通地圖沒有相同的問題,因爲由於鍵必須是枚舉,所以您不必擔心任何其他鍵被「意外」添加到地圖中。看起來Java作爲一個整體支持這種方法,因爲它們提供了EnumMap類。

0

我會說,你的兩段代碼之間的主要區別是,在枚舉的情況下,你有固定的名稱是「類型安全」的列表。在使用字符串和地圖進行操作時,很容易拼錯一些字符串,引入難以發現的錯誤。

0

我會使用枚舉在這種情況下,它是更明智的,如果這是其他人使用的東西如果你使用幾乎任何IDE,枚舉的相關值顯示給你使用地圖既不能獲得密鑰或價值。還有其他原因,但是那是一個想到的。

0

它會因任何原因而優越嗎?

地圖設計適用於動態數據,而枚舉設計適用於固定數據。

在這樣的情況下,任何一個都可以被利用,是否有任何 性能優勢使用一個在另一個?

無意義。

是更優選/傳統嗎?

只有當考慮到具體的問題有待解決。

更易維護/適應性強?

同樣,這取決於你正試圖解決的問題。

有沒有我可以用我的時候應該使用一個比 ,其它手指的任何規則?

無論您是在編譯時已知的有限的,不變的數據集。

相關問題