2012-05-04 15 views
27

है तो मैं HashMap पर EnumMap का उपयोग करने के पेशेवरों और विपक्ष का वजन करने की कोशिश कर रहा हूं। चूंकि, मैं हमेशा String का उपयोग करके देख रहा हूं, ऐसा लगता है कि HashMapString कुंजी के साथ सही विकल्प होगा। हालांकि, EnumMap बेहतर डिज़ाइन की तरह प्रतीत होता है क्योंकि यह एक विशिष्ट गणना के लिए कुंजी को प्रतिबंधित करने के अपने इरादे को व्यक्त करता है। विचार?एनमैप या हैश मैप यदि लुकअप कुंजी स्ट्रिंग

enum AnimalType { CAT, DOG } 
interface Animal {} 
class Cat implements Animal {} 
class Dog implements Animal {} 

public class AnimalFactory { 

    private static final Map<AnimalType, Animal> enumMap 
      = new EnumMap<AnimalType, Animal>(AnimalType.class); 
    // versus 
    private static final Map<String, Animal> stringMap 
      = new HashMap<String, Animal>(); 

    static { 
     enumMap.put(AnimalType.CAT, new Cat()); 
     enumMap.put(AnimalType.DOG, new Dog()); 
     stringMap.put("CAT", new Cat()); 
     stringMap.put("DOG", new Dog()); 
    } 
    public static Animal create(String type) { 
     Animal result = enumMap.get(AnimalType.valueOf(type)); 
     Animal result2 = stringMap.get(type); 
     return result; 
    } 
} 

मान लें कि AnimalType enum और नक्शा ही कहीं और जानवरों को बनाने के लिए AnimalFactory द्वारा इस्तेमाल किया जाएगा और:

यहाँ दिखा मैं कैसे Map का उपयोग किया जाएगा एक मेकअप का मानना ​​है कि उदाहरण है,।

कौन सा Map मुझे उपयोग करना चाहिए?

+0

@ डॉगबेन कोई प्रगति? – Javanator

उत्तर

12

यदि सभी वैध कुंजी का आकलन किया जा सकता है, तो मैं इसका उपयोग करता हूं क्योंकि यह सुनिश्चित करता है कि आप हमेशा वैध मान के साथ काम कर रहे हैं।

यह भ्रम से बच सकता है क्योंकि स्ट्रिंग का उपयोग बहुत सी चीजों के लिए किया जा सकता है और किसी अन्य चीज़ के लिए इस्तेमाल की जाने वाली स्ट्रिंग में "एनिमल" स्ट्रिंग को चालू करना आसान है। चूंकि enum प्रकार सामान्य रूप से अन्य प्रकारों के साथ अंतर-परिवर्तनीय नहीं होते हैं (जब तक आप एक सामान्य इंटरफ़ेस का उपयोग नहीं करते), कोडिंग में त्रुटि की कम संभावना होती है।

+0

यह देखते हुए कि पशु enum और मानचित्र केवल जानवरों को बनाने के लिए AnimalFactory द्वारा उपयोग किया जाएगा और कहीं और नहीं, क्या आपको अभी भी लगता है कि EnumMap बेहतर है? EnumMap का उपयोग करते समय लुकअप से पहले एक स्ट्रिंग को एक enum में परिवर्तित करने की लागत के बारे में आप क्या सोचते हैं? – dogbane

+1

मैप में स्ट्रिंग को देखने की लागत के समान ही है। EnumMap में कोई दोगुना नहीं है क्योंकि यह प्रभावी रूप से एक सरणी के लिए एक रैपर है। ;) –

0

मानचित्र की कुंजी अनौपचारिक और अद्वितीय होना चाहिए और यह Enum का उपयोग करके गारंटी प्राप्त किया जा सकता है।

स्ट्रिंग के प्रबंधन की तुलना में यह प्रबंधित करना आसान और कम त्रुटि प्रवण होगा।

तो EnumMap के लिए जाएं।

साथ ही हमारे पास उन्नत enums है, हम कई अन्य जानकारी और संचालन कुंजी के साथ संलग्न कर सकते हैं।

enum AnimalType { 

    Dog("I am dog and I hate cats", true), 
    CAT("I am cat and I love to eat rats", true), 
    RAT("I am a mouse and I love tearing human cloths apart", false) ; 

    private final String description; 
    private final boolean isHelpFullToHuman; 

    private AnimalType(String description , boolean isHelpFullToHuman) { 
    this.description = description; 
    this.isHelpFullToHuman = isHelpFullToHuman; 
    } 

    public boolean isHelpFullToHuman() { 
    return isHelpFullToHuman; 
    } 

    public String getDescription() { 
    return description; 
    } 

} 
+0

यह "कम त्रुटि प्रवण" कैसे है? – dogbane

+0

सूचीबद्ध कुंजी नहीं है, कुछ वर्गों में एनम्स और स्ट्रिंग कुंजियां स्थिरांक प्रबंधित करने के मामले में सिरदर्द नहीं होगा। हालांकि मेरी टिप्पणी में कम त्रुटि प्रवण शब्द केंद्रीय केंद्रित तत्व नहीं था :) – Javanator

3

संभव कुंजियों का सेट परिमित और अग्रिम में जाना जाता है (अपने उदाहरण/प्रश्न के रूप में सुझाव देते हैं), तो enum इस का एक सही प्रतिनिधित्व है। जैसा कि अन्य ने कहा, एक enum का उपयोग सुनिश्चित करता है कि कुंजी के उपयोग में कोई गलती नहीं की जाएगी।

इसके अलावा, मानचित्र के इस कार्यान्वयन काफी, अनुकूलित है के रूप में कुंजी की सीमा पहले से जाना जाता है (जहां तक ​​मैं knwow के रूप में, EnumMap लंबाई की एक सरणी का उपयोग करता है numberOfEnums आंतरिक रूप से, enum के क्रमसूचक द्वारा अनुक्रमित)।

तो मैं EnumMap भी अनुशंसा करता हूं।

दो (छोटे) बातें ध्यान में रखने के लिए, हालांकि:

  • आप विरासत द्वारा विशेष मामलों को जोड़ने के लिए सक्षम नहीं होगा (आप स्तनधारियों की विशेष मैप्स के साथ इतने जानवरों का कोई मानचित्र, एक enum विस्तार नहीं कर सकते उदाहरण के लिए तरफ)
  • जब आपके सदस्य को सदस्य जोड़ते हैं, तो यदि आप इसे अन्य सदस्यों के "बीच में" जोड़ते हैं तो आप ordinals बदलते हैं। यह जानकारी EnumMap द्वारा इस्तेमाल किया जा सकता है, यह समस्या पैदा करने वाले यदि आप (क्रमबद्धता का उपयोग कर उदाहरण के लिए) एक EnumMap enum के पुराने संस्करण से निर्माण को फिर से लोड साबित कर सकते हैं
+0

जैसा कि आप कहते हैं, एक 'EnumMap 'तेज़ है, लेकिन लुकअप करने से पहले इनपुट स्ट्रिंग को एनम में परिवर्तित करने की अतिरिक्त लागत है। – dogbane

0

सबसे पहले, आप सभी चाबियाँ अंतिम अपरिवर्तनीय हैं। आपको निश्चित रूप से EnumMap का उपयोग करना चाहिए।

इस रूबी में हैश की तरह है:

options = { :font_size => 10, :font_family => "Arial" } 

:font_size रूबी में प्रतीक, जावा में अंतिम स्थिर समकक्ष है।

संबंधित मुद्दे