2012-01-17 10 views
13

मुझे एक दूसरे को कब पसंद करना चाहिए? नीचे दिखाए गए तरीके का उद्देश्य क्या है?"नया ए()" और "एनी इंस्टेंस()" के बीच क्या अंतर है?

class A { 
    public static A newInstance() { 
     A a = new A(); 
     return a ; 
    } 
} 

क्या कोई मुझे इन दो कॉलों के बीच अंतर बता सकता है?

+1

आम तौर पर, सिंगल इंस्टेंस का उपयोग सिंगलटन डिज़ाइन पैटर्न के लिए किया जाता है। –

उत्तर

16

newInstance() अक्सर एक तरह से सीधे वस्तु के डिफ़ॉल्ट निर्माता बुला बिना एक वस्तु का दृष्टांत के रूप में प्रयोग किया जाता है। उदाहरण के लिए, यह अक्सर एक सिंगलटन डिजाइन पैटर्न लागू करने के लिए प्रयोग किया जाता है:

public class Singleton { 
    private static final Singleton instance = null; 

    // make the class private to prevent direct instantiation. 
    // this forces clients to call newInstance(), which will 
    // ensure the class' Singleton property. 
    private Singleton() { } 

    public static Singleton newInstance() { 
     // if instance is null, then instantiate the object by calling 
     // the default constructor (this is ok since we are calling it from 
     // within the class) 
     if (instance == null) { 
      instance = new Singleton(); 
     } 
     return instance; 
    } 
} 

इस मामले में, प्रोग्रामर ग्राहक वर्ग का एक उदाहरण पुनः प्राप्त करने के newInstance() कॉल करने के लिए बाध्य करती है। यह महत्वपूर्ण है क्योंकि केवल एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करने से क्लाइंट कक्षा के कई उदाहरणों तक पहुंच सकता है (जो सिंगलटन संपत्ति के खिलाफ जाता है)।

Fragment एस के मामले में, स्थिर फैक्ट्री विधि newInstance() प्रदान करना अच्छा अभ्यास है क्योंकि हम अक्सर नए तत्काल ऑब्जेक्ट में प्रारंभिक तर्क जोड़ना चाहते हैं। क्लाइंट को डिफ़ॉल्ट कन्स्ट्रक्टर कॉल करने और मैन्युअल रूप से खंड तर्कों को सेट करने के बजाय, हम newInstance() विधि प्रदान कर सकते हैं जो उनके लिए यह करता है। उदाहरण के लिए,

public static MyFragment newInstance(int index) { 
    MyFragment f = new MyFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 
    return f; 
} 

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

+0

बढ़िया, यह मुझे और आसानी से सोचता है, बहुत धन्यवाद – rex

+0

एचएम, लेकिन क्या आप एक ही कोड को कन्स्ट्रक्टर में लपेट नहीं सकते? 'सार्वजनिक वर्ग MyFragment { MyFragment (बंडल args) {this.setArguments (args) ...} MyFragment (पूर्णांक सूचकांक) {बंडल आर्ग = नए बंडल(); args.putInt (...); यह (args)} ' – Karsten

+0

आप अंतिम चर" उदाहरण "के संदर्भ को बदलने की कोशिश कर रहे हैं, इसकी त्रुटि है, है ना? –

1

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

उदाहरण के लिए, Activity एस और Fragment एस उनके रचनाकारों में प्रारंभ नहीं किए गए हैं। इसके बजाए, वे आम तौर पर ऑन्रेट के दौरान शुरू होते हैं। इसलिए, प्रारंभिकरण के दौरान ऑब्जेक्ट को जो भी पैरामीटर उपयोग करने की आवश्यकता होगी, उसे स्वीकार करने के लिए नई इंस्टेंस विधि के लिए यह सामान्य प्रथा है, और यह उन्हें एक बंडल में संग्रहीत करता है जिसे ऑब्जेक्ट बाद में पढ़ सकता है। इस का एक उदाहरण यहां देखा जा सकता:

Sample class with newInstance method

0

new() एक कीवर्ड एक वस्तु बनाने के लिए प्रयोग किया जाता है और जब तक हम वर्ग के नाम
new instance() पता है कि यह किया जा सकता है एक वस्तु बनाने के लिए इस्तेमाल एक विधि है और जब हम वर्ग के नाम के बारे में नहीं जानता कि यह किया जा सकता है