मुझे सिंगलटन को तुरंत चालू करने के तीन तरीके मिले हैं, लेकिन मुझे संदेह है कि इनमें से कोई भी सबसे अच्छा है या नहीं। मैं उन्हें एक बहु थ्रेडेड वातावरण में उपयोग कर रहा हूं और आलसी तत्कालता पसंद करता हूं।
नमूना 1:जावा सिंगलटन तत्काल
private static final ClassName INSTANCE = new ClassName();
public static ClassName getInstance() {
return INSTANCE;
}
नमूना 2:
private static class SingletonHolder {
public static final ClassName INSTANCE = new ClassName();
}
public static ClassName getInstance() {
return SingletonHolder.INSTANCE;
}
नमूना 3:
private static ClassName INSTANCE;
public static synchronized ClassName getInstance()
{
if (INSTANCE == null)
INSTANCE = new ClassName();
return INSTANCE;
}
परियोजना मैं एटीएम का उपयोग कर रहा हर जगह नमूना 2 का उपयोग करता है, लेकिन मैं एक तरह से नमूना की तरह 3 और। एनम संस्करण भी है, लेकिन मुझे बस यह नहीं मिला।
यहां सवाल यह है कि किस मामले में मुझे इनमें से किसी भी बदलाव का उपयोग नहीं करना चाहिए? मैं लंबे स्पष्टीकरण की तलाश नहीं कर रहा हूं (इसके बारे में बहुत सारे विषय हैं, लेकिन वे अंततः आईएमओ बहस करने में बदल जाते हैं), मैं इसे कुछ शब्दों के साथ समझना चाहता हूं।
लेकिन मैं इसका उपयोग कैसे करूं? उदाहरण के लिए, मेरे पास यह है: सार्वजनिक वर्ग MyClass { सार्वजनिक enum क्लासनाम { इंस्टेंस; // क्या मैं इसके बजाय यहां अपने सभी तरीकों को डालता हूं ... } // जैसा कि मैं सामान्य रूप से करता हूं? } संपादित करें: अरे, टिप्पणियों पर कोई स्वरूपण नहीं है ?? घृणा करता हूं! – jurchiks
आप नीचे अपना सिंगलटन फ़ील्ड और विधियां लिखते हैं। और फिर उन्हें 'ClassName.INSTANCE.doSomething (foo)' – Bozho
@jurchiks: yes के माध्यम से एक्सेस करें। अन्यत्र, आप सिंगलटन विधियों का उपयोग करने के लिए 'ClassName.INSTANCE.methodName()' को कॉल करेंगे (या शायद 'ClassName.INSTANCE.') से छुटकारा पाने के लिए स्थिर आयात का उपयोग करें। – Carl