2012-12-14 254 views
2

這似乎是一個常見問題,但建議框中的項目都沒有完全解釋我在想什麼。在this link,每個人都建議使用枚舉類型(我現在研究,但從未使用過)。我剛剛建議簡單地使用HashMap並閱讀答案以查看Enum(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)實際上是否是更好的答案。根據oracle的這個鏈接,「任何時候你需要使用枚舉類型來表示一組固定的常量。」所以,它是。爲什麼在這種情況下枚舉比HashMap更有用?

我的問題是...爲什麼?是否更多的是形成一個他們不會改變的合同?這是獲取某些類功能的較短途徑嗎?表現如何?爲什麼這與在同一個類中定義常量不同?

謝謝!

回答

3

枚舉實例是對象,封裝數據和行爲就像任何其他對象。通過傳遞枚舉實例,任何人都可以調用它的方法。例如,如果您將Map鍵作爲字符串傳遞,則無法對鍵執行任何操作。而且,代碼的類型安全性較低,並且自我記錄較少,因爲String很可能與它應該完全不同。

什麼是最可讀的?

public int countDays(Set<Month> months, int year) { 
    int count = 0; 
    for (Month month : months) { 
     count += month.getDays(year); 
    } 
    return count; 
} 

public int countDays(Set<String> months, int year) { 
    int count = 0; 
    for (String month : months) { 
     int days = monthMap.get(month); 
     if (month.equals(Months.FEBRUARY)) { 
      days = computeDaysInFebruary(year); 
     } 
     count += days; 
    } 
    return count; 
} 

如果我通過較集中的月份名稱以外的東西是什麼?

0

在我看來,他們只是更快地申報和使用,而且,asn oracle說,他們更適合常量。枚舉不能被修改,所以我猜他們的資源使用更小。

2

你說的所有原因都非常正確。

枚舉更有效,因爲它存儲爲一個不可變的值列表,並且不必像字典那樣支持多少操作。此外,枚舉實例只是在內部存儲爲一個單一的數字,並且可以像您定義自己的「static final int」列表一樣使用。

此外,它們添加了類型安全性,因爲您不必擔心將實際數值與代表某個選項的整數進行比較;枚舉只能與其他枚舉進行比較。它也不能像字典那樣修改,所以你知道在編譯時給出的值在運行時是相同的。

但是,我相信,最重要的原因是它增加了語義價值。這正是枚舉的目的 - 定義一組不變的選項並僅限於這些選項。如果你使用枚舉,每個人都可以直觀地理解你正在嘗試做什麼。

3

類型安全確實是一個很好的理由:當你將一個String傳遞給一個方法時,它可以是任何東西。如果你通過一個枚舉,你肯定它是合法值之一。如果可能性有限,枚舉是很好的。如果需要擴展這些值,則HashMaps很不錯。

+0

提及類型安全+1。 – Perception

3

枚舉是一個非常有限的數據類型,它允許您在編譯時限制可能的值並避免其他值,所以如果出錯,它甚至不會編譯。 HashMap會讓你插入很多非有效值,並且可以在運行時檢測它們,但是無論如何它都會編譯。

1

散列表使用了大量的內存,即使您有恆定的時間查找和插入,仍然需要完成一個很好的處理級別。必須計算散列,然後衝突的時隙必須被解析等等。雖然枚舉通常只存儲在4個字節中,但類型安全,效率高,而且對其他程序員來說顯然是你使用的。

另一個好處是,您可以輕鬆地使用枚舉值之間的位算法來表示其他值。 Windows API經常這樣做。

相關問題