जावा में कक्षा पर एक स्थिर विधि को कॉल करने से स्थिर इनटाइलाइजेशन ब्लॉक को निष्पादित करने के लिए ट्रिगर किया जाता है?जावा में स्टेटिक प्रारंभकर्ता और स्टेटिक तरीके
अनुभवजन्य, मैं नहीं कहूंगा। मैं कुछ इस तरह है:
public class Country {
static {
init();
List<Country> countries = DataSource.read(...); // get from a DAO
addCountries(countries);
}
private static Map<String, Country> allCountries = null;
private static void init() {
allCountries = new HashMap<String, Country>();
}
private static void addCountries(List<Country> countries) {
for (Country country : countries) {
if ((country.getISO() != null) && (country.getISO().length() > 0)) {
allCountries.put(country.getISO(), country);
}
}
}
public static Country findByISO(String cc) {
return allCountries.get(cc);
}
}
कोड में वर्ग का उपयोग कर, मैं की तरह कुछ कार्य करें:
Country country = Country.findByISO("RO");
समस्या यह है कि मैं एक NullPointerException
मिलता है क्योंकि नक्शा (allCountries
) प्रारंभ नहीं किया जाता है। यदि मैंने static
ब्लॉक में ब्रेकपॉइंट्स सेट अप किए हैं, तो मैं मानचित्र को सही तरीके से पॉप्युलेट कर रहा हूं, लेकिन ऐसा लगता है कि स्थैतिक विधि को प्रारंभकर्ता को निष्पादित करने का कोई ज्ञान नहीं है।
क्या कोई इस व्यवहार को समझा सकता है?
अद्यतन: मैं कोड के लिए और अधिक विस्तार जोड़ दिया है। यह अभी भी 1: 1 नहीं है (वहां कई मानचित्र हैं और अधिक तर्क हैं), लेकिन मैंने स्पष्ट रूप से allCountries
की घोषणाओं/संदर्भों को देखा है और वे ऊपर सूचीबद्ध हैं।
आप पूर्ण प्रारंभिक कोड here देख सकते हैं।
अद्यतन # 2: मैंने जितना संभव हो सके कोड को सरल बनाने की कोशिश की और इसे फ्लाई पर लिखा। प्रारंभिक कोड के बाद वास्तविक कोड स्थिर स्थिर घोषणा थी। इसने संदर्भ को रीसेट करने का कारण बना दिया, क्योंकि जॉन ने नीचे दिए गए जवाब में बताया।
मैंने इसे प्रतिबिंबित करने के लिए मेरे पोस्ट में कोड को संशोधित किया है, इसलिए यह प्रश्न ढूंढने वाले लोगों के लिए स्पष्ट है। हर किसी के भ्रम के बारे में खेद है। मैं सिर्फ हर किसी के जीवन को आसान बनाने की कोशिश कर रहा था :)।
आपके उत्तरों के लिए धन्यवाद!
क्या आप मानचित्र को प्रारंभ करने के साथ कोड दिखा सकते हैं? – Tom
बीटीडब्ल्यू आप अपने उदाहरण में findByISO() विधि का रिटर्न प्रकार खो रहे हैं। –