सामान्य तौर पर, गैर-स्थैतिक आरम्भिक ब्लॉक का उपयोग न करें (और शायद स्थैतिक से भी बचें)।
भ्रमित करने वाला सिंटेक्स
इस प्रश्न को देखते हुए, 3 उत्तर हैं, फिर भी आपने इस वाक्य रचना के साथ 4 लोगों को बेवकूफ बनाया। मैं उनमें से एक था और मैं 16 वर्षों से जावा लिख रहा हूं! स्पष्ट रूप से, वाक्यविन्यास संभावित रूप से त्रुटि प्रवण है! मैं इससे दूर रहता।
टेलिस्कोपिंग कंस्ट्रक्टर्स
वास्तव में सरल सामान के लिए, आप इस भ्रम से बचने के लिए "दूरबीन" का उपयोग कर सकते हैं:
public class Test {
private String something;
// Default constructor does some things
public Test() { doStuff(); }
// Other constructors call the default constructor
public Test(String s) {
this(); // Call default constructor
something = s;
}
}
बिल्डर पैटर्न
यदि आपको प्रत्येक निर्माणकर्ता या अन्य परिष्कृत आरंभ के अंत में doStuff () करने की आवश्यकता है, तो शायद एक बिल्डर पैटर्न सबसे अच्छा होगा। जोश बलोच कई कारणों को सूचीबद्ध करता है कि बिल्डर्स एक अच्छा विचार क्यों हैं। लिखने के लिए बिल्डरों को थोड़ा समय लगता है, लेकिन ठीक से लिखा गया है, वे उपयोग करने के लिए एक खुशी है।
public class Test {
// Value can be final (immutable)
private final String something;
// Private constructor.
private Test(String s) { something = s; }
// Static method to get a builder
public static Builder builder() { return new Builder(); }
// builder class accumulates values until a valid Test object can be created.
private static class Builder {
private String tempSomething;
public Builder something(String s) {
tempSomething = s;
return this;
}
// This is our factory method for a Test class.
public Test build() {
Test t = new Test(tempSomething);
// Here we do your extra initialization after the
// Test class has been created.
doStuff();
// Return a valid, potentially immutable Test object.
return t;
}
}
}
// Now you can call:
Test t = Test.builder()
.setString("Utini!")
.build();
स्टेटिक इनिशिएटिव लूप्स
मैं स्टैटिक इनिशियलाइज़र का बहुत उपयोग करता था , लेकिन कभी-कभार लूप्स में चला जाता था, जहाँ 2 क्लासेस एक-दूसरे के स्टैटिक इनिशियलाइज़र ब्लॉक्स पर निर्भर होते थे, जिन्हें क्लास से पहले ही लोड किया जा सकता था। यह "क्लास लोड करने में विफल" या इसी तरह अस्पष्ट त्रुटि संदेश का उत्पादन किया। मुझे स्रोत नियंत्रण में अंतिम ज्ञात कार्यशील संस्करण के साथ फ़ाइलों की तुलना करनी थी ताकि यह पता लगाया जा सके कि समस्या क्या थी। कोई मज़ा नहीं।
आलसी प्रारंभिक
हो सकता है कि जब वे काम करते हैं और बहुत भ्रामक न हों, तो स्टैटिक इनिशियलाइज़र प्रदर्शन कारणों से अच्छे होते हैं। लेकिन सामान्य तौर पर, मैं इन दिनों स्टेटिक इनिशियलाइज़र्स के लिए आलसी इनिशियलाइज़ेशन को प्राथमिकता दे रहा हूँ । यह स्पष्ट है कि वे क्या करते हैं, मैं अभी तक उनके साथ एक क्लास-लोडिंग बग में नहीं चला, और वे शुरुआती ब्लॉक की तुलना में अधिक प्रारंभिक स्थितियों में काम करते हैं।
डेटा परिभाषा
डेटा संरचनाओं के निर्माण के लिए स्थैतिक आरंभीकरण के बजाय, (अन्य उत्तरों में उदाहरणों की तुलना में), मैं अब पगुरो की अपरिवर्तनीय डेटा परिभाषा सहायक कार्यों का उपयोग करता हूं :
private ImMap<String,String> days =
map(tup("mon", "monday"),
tup("tue", "tuesday"),
tup("wed", "wednesday"),
tup("thu", "thursday"),
tup("fri", "friday"),
tup("sat", "saturday"),
tup("sun", "sunday"));
Conculsion
जावा की शुरुआत में, शुरुआती ब्लॉक कुछ काम करने का एकमात्र तरीका था, लेकिन अब वे भ्रमित कर रहे हैं, त्रुटि प्रवण, और ज्यादातर मामलों में बेहतर विकल्प (ऊपर विस्तृत) द्वारा प्रतिस्थापित किया गया है। यदि आप उन्हें लीगेसी कोड में देखते हैं, या वे एक परीक्षण पर आते हैं, तो मुझे शुरुआती ब्लॉक के बारे में जानना दिलचस्प है, लेकिन अगर मैं कोड की समीक्षा कर रहा था और मैंने एक नए कोड में देखा, तो मैं आपसे पूछना चाहता हूं कि कोई भी क्यों नहीं ऊपर दिए गए विकल्प आपके कोड को अंगूठा देने से पहले उपयुक्त थे।