2010-12-10 13 views
7

क्या यह वैरिएबल प्रारंभ करने के लिए एक अच्छा अभ्यास है, विशेष रूप से वर्ग स्तर पर ऑब्जेक्ट संदर्भों? कृपया निम्नलिखित उदाहरणों पर विचार करें;क्या सदस्यों को कक्षा या कन्स्ट्रक्टर में प्रारंभ किया जाना चाहिए?

public class MyClass { 

    private static MyObject myObject; 

    public static void main(String[] args) { 

     myObject = new MyObject(); 
    } 
} 

या

public class MyClass { 

    private MyObject myObject = new MyObject(); 

    public static void main(String[] args) { 

      // Other code 
    } 
} 

किस तरह सबसे अच्छा है? कृपया दोनों के पेशेवरों और विपक्ष के बारे में मुझे मार्गदर्शन करें।

सम्मान।

+2

ठीक है, के बाद से अपने पहले एक संकलन नहीं होगा ... –

+0

@Jonathon: एक पल के लिए स्थिर के बारे में भूल जाओ। मैं सिर्फ बेहतर तरीका जानना चाहता हूं। – Chromium

+1

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

उत्तर

6

सामान्य रूप से, आलसी तत्काल (पहला स्निपेट) पसंद किया जाता है क्योंकि ऑब्जेक्ट में (संभावित रूप से) कम जीवनकाल होता है। आपको सबसे कम ऑब्जेक्ट जीवनकाल का पक्ष लेना चाहिए।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। – Chromium

+0

+1 "आपको जितना संभव हो सके सबसे कम ऑब्जेक्ट जीवनकाल का पक्ष लेना चाहिए।" – Chromium

+0

मैंने अपना प्रश्न अपडेट किया। – Chromium

1

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

मुझे पता चला है कि कक्षा स्तर के फ़ील्ड static final, या अपरिवर्तनीय और अपरिवर्तनीय होने के लिए कुछ भी अच्छे हैं। जरूरी नहीं कि वैश्विक वैरिएबल बोलने के लिए, लेकिन इसके करीब बहुत सुंदर है। बेशक आप एक कक्षा बना रहे हैं जो डाटा ट्रांसफर ऑब्जेक्ट है, फिर जो भी आप दिखाना चाहते हैं, या शुरू किया जाना चाहिए कक्षा स्तर पर होगा। विधि स्तर फ़ील्ड किसी ऐसी चीज के लिए अच्छे हैं जो आपको अस्थायी रूप से गणना करने के लिए आवश्यक है।

+1

स्पष्टीकरण के लिए श्रीमान धन्यवाद। – Chromium

3

मेरे व्यक्तिगत अनुभव में, ऑब्जेक्ट सृजन कितना महंगा या विस्तृत है। दूसरा, आप इसे आलसी सृजन बनाम सक्रिय सृजन के रूप में भी मान सकते हैं। यदि आमतौर पर केवल कन्स्ट्रक्टर शामिल होता है तो मैं आमतौर पर वेरिएबल स्तर पर ऑब्जेक्ट्स बना देता हूं। यदि सदस्य को प्रश्न में प्रारंभ करने के लिए और कॉल हैं, तो निश्चित रूप से कॉल को कन्स्ट्रक्टर या उस विधि के लिए ले जाया जाएगा जहां इसे प्रारंभ करने की आवश्यकता है।

वास्तविक वस्तु निर्माण को किसी अन्य वर्ग में प्रस्तुत करने के लिए फैक्ट्री विधि पैटर्न का उपयोग क्यों किया जाता है।

+0

स्पष्टीकरण के लिए धन्यवाद। – Chromium

1

ध्यान दें कि सब कुछ जावा में शुरू किया गया है हालांकि वस्तुओं को शून्य में प्रारंभ किया गया है।

आप आमतौर पर शुरुआती (शून्य सूचक अपवाद) को विफल करना चाहते हैं, इसलिए आप एक निर्मित/मनमानी मूल्य के लिए प्रारंभ नहीं करना चाहते हैं, इसलिए मैं कहूंगा कि ज्यादातर मामलों में प्रारंभ नहीं होता है जब तक कि आपको पता न हो कि मूल्य क्या होना चाहिए बाहरी वर्ग निर्माण समय।

1

जब तक कि यह एक सिंगलटन न हो, इसे प्रारंभ करने के लिए समझ में नहीं आता है। आप शायद एक कन्स्ट्रक्टर या सेटर के साथ एक नया उदाहरण चाहते हैं।

1

आप भी इस के साथ की कोशिश कर सकते हैं ....

सार्वजनिक वर्ग MyClass {

private static MyObject myObject; 

public static void main(String[] args) { 

    if(myObject == null) 
    { 
     myObject = new MyObject();   //this will check ..... IMP 
    } 
} 

}

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

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