2012-06-28 27 views
22

मैंने हाल ही में जावा में EnumMap के लाभों के बारे में सीखा है और मौजूदा ImmutableMap<OccupancyType, BigDecimal> को EnumMap में बदलना चाहते हैं। हालांकि, मैं ImmutableMap द्वारा प्रदान की जाने वाली अपरिवर्तनीय संपत्ति भी पसंद करूंगा।क्या अमरूद में एक संबंधित अपरिवर्तनीय enumMap है?

  • क्या कोई भिन्नता है, अमूर्त ईनमैप अमरूद में उपलब्ध है?
  • भंडारण के मामले में कौन सा (EnumMap बनाम ImmutableMap) बेहतर प्रदर्शन करता है?
  • मुझे दो की तुलना नहीं मिली। अगर कोई मुझे किसी लिंक पर इंगित कर सकता है या दो डेटा संरचनाओं की दक्षता पर कुछ अंतर्दृष्टि दे सकता है तो मैं सराहना करता हूं?

उत्तर

30

यहां गुवा योगदानकर्ता।

गुवा में वर्तमान में ImmutableEnumMap संस्करण नहीं है, लेकिन यदि ऐसा होता है, तो शायद यह EnumMap के आसपास एक रैपर होगा। (उस ने कहा, थोड़ा बेहतर अपरिवर्तनीय कार्यान्वयन संभव है।)

EnumMap किसी भी घटना में मूल ImmutableMap से बेहतर प्रदर्शन करेगा; हरा करना मुश्किल या असंभव है।

(मैं हूँ file an issue हालांकि, enum कुंजी प्रकार के लिए एक ImmutableMap संस्करण जोड़ने की जांच के लिए।)


अद्यतन: अमरूद 14 Maps.immutableEnumMap() कहते हैं।

+0

धन्यवाद। क्या आप दो आसान की तुलना करेंगे? – brainydexter

+1

मेरा मतलब है, वास्तव में एक अच्छी तरह से परिभाषित मीट्रिक नहीं है जिसके द्वारा उनकी तुलना की जा सकती है, लेकिन मैं आपको बता सकता हूं कि 'अपरिवर्तनीय' केवल 'हैश मैप' से थोड़ा बेहतर है, इसलिए 'EnumMap' को एक ही कारक के आसपास दोनों को हराया जाना चाहिए। –

+12

अद्यतन: 'ImmutableEnumMap' [जोड़ा गया है।] (Http://code.google.com/p/guava-libraries/source/detail?r=835a7397fabb05a764a8008f4151c97f821a29ef) –

10

मैं सिर्फ एक उदाहरण प्रदान करना चाहता था कि ImmutableEnumMapGuava 14.0 में है, क्योंकि यह एक पैकेज-निजी वर्ग है, इसलिए आप ImmutableEnumMap.of() नहीं कर सकते हैं। आपको इसके बजाय Maps.immutableEnumMap() करना है।

private final ImmutableMap<MyEnum, String> myEnumMap = Maps.immutableEnumMap(ImmutableMap.of(
     MyEnum.A, "A", 
     MyEnum.B, "B", 
     MyEnum.C, "C" 
     )); 

सुनिश्चित नहीं है कि कोई और अधिक प्राकृतिक वाक्यविन्यास है या नहीं।

+2

उस कॉल के भीतर 'Maps.immutableEnumMap'' में आप 'इमटेबल मैप। builder() डाल सकते हैं। (MyEnum.A, "ए")। मानचित्र में 5 से अधिक मान जोड़ने के लिए() 'बनाएँ। – drvdijk

1

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

(एक निर्माता में) उदाहरण:

Map entries = new EnumMap <SomeEnum, T>(SomeEnum.class); 
... // (fill in entries) 
this.entries = Collections.unmodifiableMap(entries);