2012-12-13 9 views
10
public class MySingleton{ 
    private static final MySingleton INSTANCE = new MySingleton(); 
    private MySingleton(){} 
    public static getInstance(){ 
    return INSTANCE; 
    } 
} 

क्या यह सिंगलटन को लागू करने का सही तरीका है। यदि हां तो अंतिम कीवर्ड की आवश्यकता क्या है?क्या जावा सिंगलटन क्लास में आवश्यक अंतिम कीवर्ड है?

+8

यह आवश्यक नहीं है, लेकिन यह दिखाने के लिए अच्छा अभ्यास है कि मान स्थिर है। –

उत्तर

0

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

+0

अंतिम सदस्य केवल एक बार शुरू नहीं हुए हैं? इसे रीसेट कैसे किया जा सकता है? –

+0

@ user1189932 आपने एक शब्द याद किया: मैंने – AlexWien

+0

को रीसेट नहीं किया है, त्वरित प्रतिक्रिया के लिए बहुत धन्यवाद। –

2

फ़ाइनल यह सुनिश्चित करेगा कि निर्माण के बाद इंस्टेंस बदलने योग्य नहीं है। यदि आप केवल एक कन्स्ट्रक्टर सहित हैं, और कोई सेटर्स नहीं है, तो यह एक बड़ा सौदा नहीं है। कोई भी आपके इंस्टेंस को बदल नहीं सकता है और आप इसे बदल नहीं रहे हैं।

कक्षा को बाद में बदलने के मामले में इसे छोड़ने का कोई बुरा विचार नहीं है। अपरिवर्तनीयता कुछ फायदे प्रदान करती है (आसान क्रमबद्धता, आपके पीछे अपनी वस्तु को बदलने के खिलाफ बीमा, आदि)।

अपर्याप्तता को वापस लेना मुश्किल है। अपना कोड रक्षात्मक रूप से लिखें ताकि कोई भी इसे बाद में गड़बड़ न कर सके।

2

आम तौर पर पसंद दृष्टिकोण एक enum

public enum MySingleton { 
    INSTANCE; 
} 

अपने उदाहरण में अंतिम कीवर्ड इरादा पता चलता है और पुनर्निर्धारण (= बग) कर पाएगा लेकिन सख्ती से आवश्यक नहीं है का उपयोग करें।

विशेष रूप से, चर स्थिर है, इसे बहु-थ्रेडेड वातावरण में सुरक्षित रूप से प्रकाशित होने के लिए अंतिम होने की आवश्यकता नहीं है।

+0

एनम सिंगलटन एक बहुत बुरा विचार है ... – irreputable

+0

क्या आप विस्तृत कर सकते हैं? – assylias

+0

सिंगलेट्स बिल्कुल खराब हैं, एनम सिंगलेट्स यूनिट परीक्षणों द्वारा रीसेट नहीं किया जा सकता है।तो यह एक सच्चे बुराई सिंगलटन है, जो सबसे खराब हो सकता है। – AlexWien

1

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

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

अंतिम संशोधक जावा संकलक और रनटाइम को अच्छा अनुकूलन और थ्रेड-सुरक्षा निर्णय लेने की अनुमति देता है। मैं हमेशा सिंगलटन घोषणा की इस शैली के साथ फाइनल का उपयोग करता हूं। मैं अब तक कहूंगा कि यह एक खराब डिजाइन विकल्प है जो सिंगलटन इंस्टेंस को म्यूटेबल करने की इजाजत देता है - क्योंकि क्लाइंट कोड अब प्रक्रिया के जीवनकाल के लिए समान मूल्य को देखने पर भरोसा नहीं कर सकता है।

यह एक विन्यास कारखाने वर्ग के साथ इकाई परीक्षण मुद्दे से निपटने के लिए संभव है:

private static final MySingleton INSTANCE = MySingletonFactory.create(); 

... अंतिम के लाभों को खोने के बिना।

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