2010-05-18 10 views
38

मेरे पास एक अंतिम गैर स्थैतिक सदस्य है:जावा में, एक अंतिम क्षेत्र एक कन्स्ट्रक्टर सहायक से शुरू किया जा सकता है?

private final HashMap<String,String> myMap; 

मैं इसे कन्स्ट्रक्टर द्वारा बुलाए गए विधि का उपयोग करके प्रारंभ करना चाहता हूं। चूंकि myMap फ़ाइनल है, इसलिए मेरी "सहायक" विधि इसे प्रारंभ करने में असमर्थ है। बेशक मेरे पास विकल्प हैं:

मैं सीधे कन्स्ट्रक्टर में myMap प्रारंभिक कोड लागू कर सकता हूं।

MyConstructor (String someThingNecessary) 
{ 
    myMap = new HashMap<String,String>(); 

    myMap.put("blah","blahblah"); 
    // etc... 

    // other initialization stuff unrelated to myMap 
} 

मैं अपने सहायक विधि को हैश मैप का निर्माण कर सकता हूं, इसे कन्स्ट्रक्टर पर वापस कर सकता हूं, और कन्स्ट्रक्टर को ऑब्जेक्ट को myMap पर असाइन कर सकता हूं।

MyConstructor (String someThingNecessary) 
{ 
    myMap = InitializeMyMap(someThingNecessary); 

    // other initialization stuff unrelated to myMap 
} 

private HashMap<String,String> InitializeMyMap(String someThingNecessary) 
{ 
    HashMap<String,String> initializedMap = new HashMap<String,String>(); 

    initializedMap.put("blah","blahblah"); 
    // etc... 

    return initializedMap; 
} 

विधि # 2 ठीक है, हालांकि, मैं सोच रहा हूं कि अगर कोई तरीका है तो मैं हेल्पर विधि को सीधे मैप मैप में हेरफेर करने की अनुमति दे सकता हूं। शायद एक संशोधक जो इंगित करता है कि इसे केवल निर्माता द्वारा ही बुलाया जा सकता है?

MyConstructor (String someThingNecessary) 
{ 
    InitializeMyMap(someThingNecessary); 

    // other initialization stuff unrelated to myMap 
} 


// helper doesn't work since it can't modify a final member 
private void InitializeMyMap(String someThingNecessary) 
{ 
    myMap = new HashMap<String,String>(); 

    myMap.put("blah","blahblah"); 
    // etc... 
} 
+0

क्या आप जानते हैं कि आपके प्रश्न का उत्तर देने वाले लोग क्या करेंगे? हां, वे ग्रहण खोलकर और अपने कोड को कॉपी-पेस्ट करके इसे आज़माएंगे! :) – Simon

+5

@ सिमॉन मेरा प्रश्न मैंने जो कोशिश की है उसके विकल्प का अनुरोध कर रहा है। मैं सोच रहा हूं कि अगर उस भाषा के बेहतर ज्ञान वाले किसी व्यक्ति को मुझे किसी कीवर्ड या प्रतिमान के लिए मार्गदर्शन कर सकता है, तो मुझे अनजान है। – csj

+3

उत्तर संख्या है स्रोत: जावा भाषा विनिर्देश 8.3.1.2 – mihi

उत्तर

12

विधि # 2 आपका सबसे अच्छा विकल्प है। समस्या यह है कि यदि आपके पास निजी विधि में असाइनमेंट है तो कन्स्ट्रक्टर के बाहर कक्षा में अन्य कोड को रोकने से कुछ भी नहीं है, जो अंतिम क्षेत्र में दूसरे असाइनमेंट के प्रयास के साथ कोई समस्या उत्पन्न करेगा।

जावा में एक अलग विधि का कोई निर्माण नहीं है जिसे केवल निर्माण के दौरान ही बुलाया जा सकता है।

private final HashMap<String, String> myMap = new HashMap<String, String(); 

और फिर:

MyConstructor (String someThingNecessary) 
{ 
    initializeMyMap(someThingNecessary); 

    // other initialization stuff unrelated to myMap 
} 


// helper doesn't work since it can't modify a final member 
private void initializeMyMap(String someThingNecessary) 
{ 

    myMap.clear(); 
    myMap.put("blah","blahblah"); 
    // etc... 
    } 

और अगर आप

पूर्णता लिए, हम एक तीसरा विकल्प है, जहां आप प्रारंभ पर नक्शा आवंटित और फिर सहायक विधि यह भरने कर सकते हैं वास्तव में भ्रमित होना चाहते हैं कि आप एक निर्माता के बजाय प्रारंभकर्ता का उपयोग कर सकते हैं, लेकिन आपको ऐसा नहीं करना चाहिए, इसलिए जब तक आपको वास्तव में जानने की आवश्यकता न हो, मैं उस पर विस्तार नहीं करूंगा।

+5

वास्तव में, जावा है। इसे एक कन्स्ट्रक्टर कहा जाता है ;-) – Joey

+1

@ जोहान्स नो, उसका मतलब है कि कोई उप-कन्स्ट्रक्टर पदनाम नहीं है जो इस शर्त पर अंतिम चर के असाइनमेंट की अनुमति देगा कि विधि को केवल कन्स्ट्रक्टर से ही बुलाया जा सकता है। – corsiKa

+0

@Yishai। विकल्प के लिए धन्यवाद। इसके अलावा, प्रारंभकर्ताओं के बारे में, मुझे नहीं लगता कि यह वैसे भी काम करेगा, क्योंकि हैश मैप सामग्री वास्तव में निर्माता को दिए गए तर्क पर निर्भर हैं। – csj

1

विकल्प # 2 सबसे अधिक पुन: प्रयोज्य विकल्प है, क्योंकि आप इसे सभी रचनाकारों के बीच साझा कर सकते हैं। हमें यहां क्या चाहिए, सी # के संग्रह प्रारंभकर्ता हैं। :)

(BTW: # 3 संकलन नहीं होगा)

+0

आपकी मदद साइमन के लिए धन्यवाद। मैं जाने-जाने से जानता था कि # 3 संकलित नहीं होगा। मैं उम्मीद कर रहा था कि यह गारंटी देकर कानूनी बनाने का एक तरीका हो सकता है कि सहायक केवल कन्स्ट्रक्टर से कॉल करने योग्य होगा। ऐसा प्रतीत होता है कि यह संभव नहीं है। – csj

13

कैसे एक निजी निर्माता है कि आपके HashMap initializes, और फिर अपने मुख्य निर्माता (रों) है कि निजी निर्माता कॉल को लागू करने के बारे में?

लिए example--

// Helper function to initialize final HashMap. 
private MyConstructor() 
{ 
    myMap = new HashMap<String,String>(); 
    myMap.put("blah","blah"); 
} 

MyConstructor (String someThingNecessary) 
{ 
    // Initialize the HashMap. 
    this(); 
    // Other initialization code can follow. 
} 

आप निजी सहायक निर्माता के रूप में की जरूरत है (उदाहरण के लिए पैरामीटर डेटा प्रदान करने के लिए या हस्ताक्षर भी सार्वजनिक कंस्ट्रक्टर्स से अलग करने के लिए) के हस्ताक्षर संशोधित कर सकते हैं।

+0

मुझे लगता है कि यह समाधान है जो @ जॉय उपरोक्त संकेत दे रहा था जब उसने कहा, "वास्तव में, जावा है। इसे एक निर्माता कहा जाता है," यिशई की टिप्पणी के जवाब में "जावा के पास एक अलग विधि का निर्माण नहीं है जिसे केवल दौरान ही बुलाया जा सकता है निर्माण। " – cjerdonek

+0

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

+0

धन्यवाद, @csj। मैं उसी प्रश्न का उत्तर ढूंढ रहा था और इस बारे में सोचा था। पहले से प्रस्तावित दृष्टिकोणों में से कोई भी मेरे अंतिम उपयोग के लिए कई अंतिम क्षेत्रों को शुरू करने के लिए बहुत अच्छा काम नहीं करेगा। नाम के लिए, हाँ, यह बेहतर हो सकता है। लेकिन कम से कम यह कुछ शुरू करने वाले रचनाकारों के साथ संगत है। :) मैं जावा के लिए नया हूं और आश्चर्यचकित नहीं होगा अगर वहाँ एक बेहतर समाधान भी है। – cjerdonek

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