2010-03-10 14 views
14

my answer from yesterday में मैं कोड का निम्न भाग "हैक" कहा जाता है:एक निजी वर्ग को उपनाम के रूप में घोषित करने के लिए स्वीकार्य है?

final class MyMap extends HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier> {} 
// declared MyMap as an alias for readability purposes only 

MyMap a = new MyMap(); 
a.put("key", "val"); 

यह एक और सोचा देते हुए इस एक बुरा विचार की तरह बिल्कुल नहीं लगता है, लेकिन मैं कुछ कमी हो सकती है। क्या कोई खंभे है जिस पर मुझे याद आया? जावा में उपनाम घोषित करने के लिए यह एक स्वीकार्य (संभवतः रचनात्मक) तरीका है?

+0

सिफारिशों के अनुसार 'अंतिम' संशोधक जोड़ा गया ... –

उत्तर

5

दोष यह होगा कि आप सीधे किसी भी विधि का उपयोग करने में सक्षम नहीं होंगे जो सही ढंग से टाइप किए गए Map लौटाता है, क्योंकि वे कभी भी MyMap वापस नहीं करेंगे। भले ही वे Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> वापस कर सकें।

उदाहरण के लिए आप filter() विधियों को Maps (Google Collections द्वारा प्रदान किए गए) में उपयोग करने में सक्षम नहीं होंगे। वे MyMap इनपुट इनपुट के रूप में स्वीकार करेंगे, लेकिन वे वापसी केवल Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> स्वीकार करेंगे।

यह समस्या MyMap लिखकर Map कार्यान्वयन के लिए कुछ हद तक कम हो सकती है। फिर आप इस तरह के एक विधि के रिटर्न वैल्यू को कन्स्ट्रक्टर में पास कर सकते हैं और अभी भी MyMap (प्रतिलिपि किए बिना) भी हो सकता है। डिफ़ॉल्ट कन्स्ट्रक्टर सिर्फ प्रतिनिधि को नए HashMap इंस्टेंस पर सेट कर सकता है, इसलिए डिफ़ॉल्ट उपयोग वही रहेगा।

2

मैं व्यक्तिगत रूप से इस करना होगा नहीं है, और यह एक समीक्षा में झंडा होगा, लेकिन इस राय की बात है।

Map<SomeSuperLongIdentifier, OtherSuperLongIdentifier> a = Maps.newHashMap(); 

मैं तरीके कोड refactor करने के लिए इस मानचित्र के इतने उदाहरणों घोषित करने के लिए, शायद नहीं करने के लिए देखो चाहते हैं:

गूगल संग्रह इस समस्या को कम है, जिससे आप की घोषणा से मदद करता है।

2

जब तक आपके कोड का उपयोग करने वाले डेवलपर्स आईडीई होते हैं और कक्षा की परिभाषा पर जल्दी से कूदने में सक्षम होते हैं और इसके उद्देश्य के लिए टिप्पणियां पढ़ते हैं (जो जगह में हैं, नहीं?), मैं इसके साथ कुछ भी गलत नहीं देख सकता।

+0

इसके अतिरिक्त एलियासिंग समस्याएं खराब नहीं हैं क्योंकि ओपी ने "निजी" कक्षाओं के बारे में पूछा ताकि "उपनाम" लीक न हो। –

3

मैं यह निश्चित रूप से प्रकार समानार्थी शब्दों की घोषणा करने के लिए एक सुविधाजनक तरीका लगता है। कुछ भाषाओं में उस के लिए प्रत्यक्ष समर्थन है (में डेल्फी (पास्कल), उदाहरण के लिए, आपको लगता है कि इस तरह कर सकते हैं:।

type MyMap = HashMap<SomeSuperLongIdentifier, OtherSuperLongIdentifier>; 

के बाद से जावा नहीं है, मुझे लगता है कि आपको लगता है कि के लिए विरासत का उपयोग कर सकते आप दस्तावेज़ की जरूरत है, कि यह घोषणा सिर्फ एक समानार्थी है और किसी को इस वर्ग में कोई तरीका नहीं जोड़ना चाहिए। ध्यान दें कि यह वीएमटी स्टोरेज के लिए थोड़ी सी स्मृति का उपभोग करता है।

+0

यह सुनिश्चित करने के लिए कि कोई भी विधि जोड़ नहीं सकता है, बस इसे 'अंतिम' –

+2

@Aaron Digulla घोषित करें। यह केवल उप-वर्गों पर लागू होता है। कोई भी बाद में आ सकता है और 'माईमैप' में विधियों को जोड़ सकता है और 'अंतिम' इसे रोक नहीं पाएगा। –

+0

इस तरह का एक प्रकार का पर्याय उपयोगी हो सकता है, लेकिन जावा में यह संभव नहीं है। एक उपclass एक समानार्थी नहीं है। –

0

मैं इसे एक हैक नहीं कहूंगा। व्यक्तिगत रूप से, मैंने उपनाम बनाया है ।

3

सामान्य प्रकार पैरामीटर जो बदला नहीं जा सकता घोषित करने और कुछ स्पष्टता बनाने के उद्देश्य के लिए मैं नामपर आपत्ति होगी: चूंकि आप उपनाम बनाते हैं, इसे एक उपयोगी नाम देकर इसे अपना उद्देश्य बनाएं। उसके अलावा, मुझे यह पसंद है।

+0

'माईमैप' वास्तविक उदाहरण कोड में निश्चित रूप से एक उदाहरण का नाम है, यह एक सार्थक नाम होना चाहिए। –

1

मुझे लगता है कि विरासत एक बहुत बड़ी बंदूक हाथ में समस्या की तुलना में है। कम से कम मैं एक बड़े वसा टिप्पणी अपने अस्तित्व के लिए कारण का वर्णन के साथ इस "उर्फ वर्ग" अंतिम बना सकता था,।

+0

इसे अंतिम बनाया :) –

+0

आपको उन रचनाकारों के बारे में भी निर्णय लेना है जिन्हें आप बेनकाब करना चुनते हैं। –

1

ठीक है, यहाँ दो विरोधाभासी पहलू हैं।

  1. देखने के एक मॉडलिंग बिंदु पर, अपने घोषणा सही क्योंकि यह कैप्सूलीकरण अपनी कक्षा प्रदान करता है पर जोर देती है,।
  2. कोडिंग बिंदु पर, आपकी घोषणा गलत के रूप में माना जा सकता है क्योंकि आप केवल एक अतिरिक्त सुविधा के साथ मॉडलिंग समर्थन के रूप में एक वर्ग जोड़ते हैं।

हालांकि, मुझे आपका दृष्टिकोण काफी सही लगता है (हालांकि मैं इसके बारे में कभी नहीं जानता), क्योंकि यह बहुत सराहना करता है (ठीक है, मेरे लिए, कम से कम) संकलित मॉडल: आपके मॉडल से कक्षाएं पूरी तरह से परिलक्षित होती हैं आपका कोड, आपके विनिर्देश निष्पादन योग्य बनाना, बहुत अच्छा क्या है।

यह सब मुझे यह कहने के लिए लाता है कि यह निश्चित रूप से एक अच्छा विचार है, बशर्ते आप इसे दस्तावेज़ीकरण के साथ समर्थन दें।

2

मैं इसे 'उपनाम' नहीं कहूंगा। यह नहीं है इसका उपयोग अलगाव के रूप में होने वाले प्रकार के साथ एक दूसरे के साथ नहीं किया जा सकता है। तो अगर यह इरादा है, तो यह विफल हो जाता है।

0

यदि आप किसी अन्य जेवीएम को भेज रहे हैं तो आपके मैपैप क्लास में भेजने के लिए आप इस मानचित्र का उपयोग क्रमबद्ध नहीं कर पाएंगे।

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

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