यदि आप 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
आप जो उपयोग कर रहे हैं वही होगा, केवल इसकी सामग्री बदल दी गई है)।