यदि आप fooस्थैतिक बनाते हैं , तो आपको निम्न उदाहरणों की तरह इसे क्लास कंस्ट्रक्टर (या इनलाइन जहां आप इसे परिभाषित करते हैं) में इनिशियलाइज़ करना होगा।
क्लास कंस्ट्रक्टर (उदाहरण नहीं):
private static final List foo;
static
{
foo = new ArrayList();
}
पंक्ति में:
private static final List foo = new ArrayList();
यहां समस्या यह नहीं है कि finalसंशोधक कैसे काम करता है, बल्कि यह भी है कि staticसंशोधक कैसे काम करता है।
finalसंशोधक समय के आधार पर आपके निर्माता पूर्ण करता कॉल (यानी आप निर्माता में यह प्रारंभ करना होगा) आपके संदर्भ के प्रारंभ लागू करता है।
जब आप किसी विशेषता को प्रारंभ करते हैं, तो यह उस कोड से पहले आरंभीकृत हो जाता है, जिसे आपने कंस्ट्रक्टर के लिए निर्धारित किया है, जिसे चलाया जाता है, इसलिए आपको निम्नलिखित परिणाम मिलते हैं:
- यदि
fooहै static, तो आपके द्वारा अपनी कक्षा के लिए निर्धारित किए foo = new ArrayList()गए static{}कंस्ट्रक्टर से पहले निष्पादित किया जाएगा
- यदि
fooनहीं static, तो foo = new ArrayList()आपके कंस्ट्रक्टर को चलाने से पहले निष्पादित किया जाएगा
जब आप किसी विशेषता-इन-लाइन को सम्मिलित नहीं करते हैं, तो finalसंशोधक लागू करता है कि आप इसे प्रारंभ करते हैं और आपको निर्माणकर्ता में ऐसा करना चाहिए। यदि आपके पास एक staticसंशोधक भी है , तो निर्माणकर्ता को आपको वर्ग 'इनिशियलाइज़ेशन ब्लॉक' में विशेषता को इनिशियलाइज़ करना होगा:static{} :।
आपके कोड में आपको जो त्रुटि मिलती है, वह इस तथ्य से है कि static{}जब क्लास लोड की जाती है, तो उस समय से पहले जब आप उस क्लास की किसी वस्तु को इंस्टेंट करते हैं। इस प्रकार, fooजब कक्षा बनाई जाती है , तो आपने प्रारंभ नहीं किया होगा ।
static{}ब्लॉक को एक प्रकार की वस्तु के लिए एक निर्माता के रूप में सोचें Class। यह वह जगह है जहाँ आपको अपनी static finalश्रेणी के गुणों का आरंभीकरण अवश्य करना चाहिए (यदि इनलाइन नहीं किया गया है)।
पक्षीय लेख:
finalसंशोधक भरोसा दिलाते const सत्ता केवल आदिम प्रकार और संदर्भ के लिए।
जब आप एक finalवस्तु घोषित करते हैं , तो आपको जो मिलता है वह एक final संदर्भ है , वह उस वस्तु का होता है, लेकिन वस्तु स्वयं स्थिर नहीं होती है।
क्या तुम सच में जब एक घोषित प्राप्त कर रहे हैं finalकि विशेषता है, एक बार आप (तरह अपने विशिष्ट प्रयोजन के लिए एक वस्तु की घोषणा final Listहै कि आप घोषणा की है), कि और केवल उस वस्तु उस उद्देश्य के लिए उपयोग किया जाएगा: आप नहीं कर परिवर्तन करने के लिए किया जाएगा List fooकरने के लिए एक और List, लेकिन आप अभी भी Listआइटम जोड़कर / हटाकर अपने को बदल सकते हैं ( Listआप जो उपयोग कर रहे हैं वही होगा, केवल इसकी सामग्री बदल दी गई है)।