CodeGym /Java Blog /यादृच्छिक /जावा सिंगलटन क्लास
John Squirrels
पातळी 41
San Francisco

जावा सिंगलटन क्लास

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! आज आपण जावा सिंगलटन पॅटर्नपासून सुरू होणार्‍या विविध डिझाइन पॅटर्नच्या तपशीलांमध्ये जाऊ. चला पुनरावलोकन करूया: सर्वसाधारणपणे डिझाइन नमुन्यांबद्दल आम्हाला काय माहित आहे? डिझाइन पॅटर्न हे सर्वोत्तम पद्धती आहेत ज्या आम्ही अनेक ज्ञात समस्या सोडवण्यासाठी लागू करू शकतो. डिझाइन पॅटर्न सामान्यतः कोणत्याही प्रोग्रामिंग भाषेशी जोडलेले नसतात. तुम्हाला चुका टाळण्यासाठी आणि चाक पुन्हा शोधण्यात मदत करण्यासाठी त्यांना शिफारसींचा संच म्हणून विचार करा.डिझाइन पॅटर्न: सिंगलटन - १

जावा मध्ये सिंगलटन म्हणजे काय?

सिंगलटन हा सर्वात सोपा वर्ग-स्तरीय डिझाइन नमुन्यांपैकी एक आहे. काहीवेळा लोक म्हणतात "हा वर्ग सिंगलटन आहे", ज्याचा अर्थ असा आहे की वर्ग सिंगलटन डिझाइन पॅटर्न लागू करतो. काहीवेळा एक वर्ग लिहिणे आवश्यक असते जेथे आम्ही एकाच ऑब्जेक्टवर इन्स्टंटेशन प्रतिबंधित करतो. उदाहरणार्थ, लॉगिंग किंवा कनेक्ट करण्यासाठी जबाबदार वर्ग डेटाबेस. सिंगलटन डिझाइन पॅटर्न हे आम्ही कसे साध्य करू शकतो याचे वर्णन करतो. सिंगलटन हा एक डिझाइन पॅटर्न आहे जो दोन गोष्टी करतो:
  1. हे हमी देते की वर्गाचा फक्त एकच प्रसंग असेल.

  2. हे त्या उदाहरणासाठी जागतिक प्रवेशाचा एकल बिंदू प्रदान करते.

म्हणून, सिंगलटन पॅटर्नच्या जवळजवळ प्रत्येक अंमलबजावणीचे वैशिष्ट्य असलेली दोन वैशिष्ट्ये आहेत:
  1. खाजगी बांधकाम करणारा. हे वर्गाच्या बाहेरील वस्तू तयार करण्याची क्षमता मर्यादित करते.

  2. एक सार्वजनिक स्थिर पद्धत जी वर्गाचे उदाहरण परत करते. या पद्धतीला getInstance म्हणतात . हा वर्ग उदाहरणासाठी जागतिक प्रवेशाचा मुद्दा आहे.

अंमलबजावणी पर्याय

सिंगलटन डिझाइन पॅटर्न विविध प्रकारे लागू केला जातो. प्रत्येक पर्याय त्याच्या स्वत: च्या मार्गाने चांगला आणि वाईट आहे. नेहमीप्रमाणे, येथे कोणताही परिपूर्ण पर्याय नाही, परंतु आपण एकासाठी प्रयत्न केला पाहिजे. सर्वप्रथम, चांगलं आणि वाईट काय आहे हे ठरवू या आणि डिझाइन पॅटर्नच्या विविध अंमलबजावणीचे आम्ही कसे मूल्यांकन करतो यावर कोणते मेट्रिक्स परिणाम करतात. चला चांगल्यापासून सुरुवात करूया. अंमलबजावणीला अधिक रसाळ आणि आकर्षक बनवणारे घटक येथे आहेत:
  • आळशी आरंभीकरण: आवश्यकतेपर्यंत उदाहरण तयार केले जात नाही.

  • साधा आणि पारदर्शक कोड: हा मेट्रिक अर्थातच व्यक्तिनिष्ठ आहे, पण तो महत्त्वाचा आहे.

  • थ्रेड सुरक्षा: मल्टी-थ्रेडेड वातावरणात योग्य ऑपरेशन.

  • मल्टी-थ्रेडेड वातावरणात उच्च कार्यप्रदर्शन: संसाधन सामायिक करताना थोडे किंवा कोणतेही थ्रेड अवरोधित करणे.

आता बाधक. अंमलबजावणी खराब प्रकाशात आणणारे घटक आम्ही सूचीबद्ध करू:
  • आळशी आरंभीकरण नाही: जेव्हा अनुप्रयोग सुरू होतो तेव्हा वर्ग लोड केला जातो, त्याची गरज आहे की नाही याची पर्वा न करता (विरोधाभास म्हणजे, आयटी जगात आळशी असणे चांगले आहे)

  • क्लिष्ट आणि वाचण्यास कठीण कोड. हे मेट्रिक देखील व्यक्तिनिष्ठ आहे. तुमच्या डोळ्यातून रक्तस्राव सुरू झाल्यास, आम्ही असे गृहीत धरू की अंमलबजावणी सर्वोत्तम नाही.

  • धाग्याच्या सुरक्षिततेचा अभाव. दुसऱ्या शब्दांत, "थ्रेड डेंजर". मल्टी-थ्रेडेड वातावरणात चुकीचे ऑपरेशन.

  • मल्टी-थ्रेडेड वातावरणात खराब कार्यप्रदर्शन: संसाधन सामायिक करताना थ्रेड्स एकमेकांना नेहमीच अवरोधित करतात.

कोड

आता आम्ही विविध अंमलबजावणी पर्यायांचा विचार करण्यास आणि साधक आणि बाधक सूचित करण्यास तयार आहोत:

सोपे


public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    
    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
सर्वात सोपी अंमलबजावणी. साधक:
  • साधा आणि पारदर्शक कोड

  • धाग्याची सुरक्षा

  • मल्टी-थ्रेडेड वातावरणात उच्च कार्यक्षमता

बाधक:
  • आळशी आरंभ नाही.
मागील त्रुटी दूर करण्याच्या प्रयत्नात, आम्हाला अंमलबजावणी क्रमांक दोन मिळतात:

आळशी आरंभ


public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
साधक:
  • आळशी आरंभ.

बाधक:
  • धागा सुरक्षित नाही

ही अंमलबजावणी मनोरंजक आहे. आम्ही आळशीपणे सुरुवात करू शकतो, परंतु आम्ही थ्रेड सुरक्षितता गमावली आहे. काळजी करू नका — आम्ही अंमलबजावणी क्रमांक तीन मध्ये सर्वकाही समक्रमित करतो.

सिंक्रोनाइझ केलेला प्रवेश


public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
साधक:
  • आळशी आरंभ.

  • धाग्याची सुरक्षा

बाधक:
  • खराब मल्टीथ्रेड कामगिरी

उत्कृष्ट! अंमलबजावणी क्रमांक तीनमध्ये, आम्ही थ्रेड सुरक्षा पुनर्संचयित करतो! अर्थात, ते धीमे आहे... आता getInstance पद्धत सिंक्रोनाइझ झाली आहे, त्यामुळे ती एका वेळी फक्त एकाच थ्रेडद्वारे कार्यान्वित केली जाऊ शकते. संपूर्ण पद्धत सिंक्रोनाइझ करण्याऐवजी, आम्हाला प्रत्यक्षात फक्त नवीन उदाहरण सुरू करणारा भाग सिंक्रोनाइझ करणे आवश्यक आहे. परंतु नवीन उदाहरण तयार करण्यासाठी जबाबदार भाग गुंडाळण्यासाठी आम्ही सिंक्रोनाइझ केलेला ब्लॉक वापरू शकत नाही . असे केल्याने धाग्याची सुरक्षा सुनिश्चित होणार नाही. हे सर्व थोडे अधिक क्लिष्ट आहे. योग्य सिंक्रोनाइझेशन खाली पाहिले जाऊ शकते:

डबल-चेक केलेले लॉकिंग


public class Singleton {
    private static final Singleton INSTANCE;

  private Singleton() {
  }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
साधक:
  • आळशी आरंभ.

  • धाग्याची सुरक्षा

  • मल्टी-थ्रेडेड वातावरणात उच्च कार्यक्षमता

बाधक:
  • Java च्या आधीच्या 1.5 च्या आवृत्त्यांमध्ये समर्थित नाही (1.5 आवृत्ती पासून अस्थिर कीवर्डचा वापर निश्चित आहे)

लक्षात घ्या की हा अंमलबजावणी पर्याय योग्यरित्या कार्य करण्यासाठी, दोनपैकी एक अटी पूर्ण करणे आवश्यक आहे. INSTANCE व्हेरिएबल एकतर अंतिम किंवा अस्थिर असणे आवश्यक आहे . शेवटची अंमलबजावणी ज्याची आपण आज चर्चा करू ते म्हणजे वर्ग धारक सिंगलटन .

वर्ग धारक


public class Singleton {

   private Singleton() {
   }

   private static class SingletonHolder {
       public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
       return SingletonHolder.HOLDER_INSTANCE;
   }
}
साधक:
  • आळशी आरंभ.

  • धाग्याची सुरक्षा.

  • मल्टी-थ्रेडेड वातावरणात उच्च कार्यक्षमता.

बाधक:
  • योग्य ऑपरेशनसाठी हमी आवश्यक आहे की सिंगलटन ऑब्जेक्ट त्रुटींशिवाय प्रारंभ केला जाईल. अन्यथा, getInstance पद्धतीच्या पहिल्या कॉलचा परिणाम ExceptionInInitializerError होईल , आणि त्यानंतरचे सर्व कॉल NoClassDefFoundError तयार करतील .

ही अंमलबजावणी जवळजवळ परिपूर्ण आहे. हे आळशी आहे, आणि धागा सुरक्षित आणि जलद आहे. परंतु बाधकांच्या यादीमध्ये स्पष्ट केल्याप्रमाणे त्यात एक सूक्ष्मता आहे. सिंगलटन पॅटर्नच्या विविध अंमलबजावणीची तुलना:
अंमलबजावणी आळशी आरंभ धाग्याची सुरक्षा मल्टीथ्रेड कामगिरी कधी वापरायचे?
सोपे - + जलद कधीच नाही. किंवा शक्यतो जेव्हा आळशी आरंभ करणे महत्वाचे नसते. पण कधीही चांगले होणार नाही.
आळशी आरंभ + - लागू नाही नेहमी जेव्हा मल्टीथ्रेडिंगची आवश्यकता नसते
सिंक्रोनाइझ केलेला प्रवेश + + मंद कधीच नाही. किंवा शक्यतो जेव्हा मल्टीथ्रेडेड कामगिरी काही फरक पडत नाही. पण कधीही चांगले होणार नाही.
डबल-चेक केलेले लॉकिंग + + जलद क्वचित प्रसंगी जेव्हा तुम्हाला सिंगलटन तयार करताना अपवाद हाताळावे लागतात (जेव्हा वर्गधारक सिंगलटन लागू होत नाही)
वर्ग धारक + + जलद जेव्हा जेव्हा मल्टीथ्रेडिंगची आवश्यकता असते आणि एक हमी असते की सिंगलटन ऑब्जेक्ट समस्यांशिवाय तयार केला जाईल.

सिंगलटन पॅटर्नचे फायदे आणि तोटे

सर्वसाधारणपणे, सिंगलटन त्याच्याकडून जे अपेक्षित आहे तेच करतो:
  1. हे हमी देते की वर्गाचा फक्त एकच प्रसंग असेल.

  2. हे त्या उदाहरणासाठी जागतिक प्रवेशाचा एकल बिंदू प्रदान करते.

तथापि, या पॅटर्नमध्ये कमतरता आहेत:
  1. सिंगलटन एकल जबाबदारीच्या तत्त्वाचे उल्लंघन करते: त्याच्या थेट कर्तव्यांव्यतिरिक्त, सिंगलटन वर्ग घटनांच्या संख्येवर देखील नियंत्रण ठेवतो.

  2. एका सामान्य वर्गाचे सिंगलटनवर अवलंबून असणे वर्गाच्या सार्वजनिक करारामध्ये दिसत नाही.

  3. ग्लोबल व्हेरिएबल्स वाईट आहेत. सरतेशेवटी, सिंगलटन हे मोठ्या जागतिक व्हेरिएबलमध्ये बदलते.

  4. सिंगलटनची उपस्थिती संपूर्णपणे अनुप्रयोगाची चाचणीक्षमता आणि विशेषतः सिंगलटन वापरणारे वर्ग कमी करते.

आणि तेच! :) आम्ही तुमच्यासोबत Java सिंगलटन क्लास एक्सप्लोर केला आहे. आता, तुमच्या उर्वरित आयुष्यासाठी, तुमच्या प्रोग्रामर मित्रांशी संभाषण करताना, तुम्ही पॅटर्न किती चांगला आहे हे सांगू शकत नाही, तर ते कशामुळे वाईट होते याबद्दल काही शब्द देखील सांगू शकता. या नवीन ज्ञानावर प्रभुत्व मिळवण्यासाठी शुभेच्छा.

अतिरिक्त वाचन:

टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION