मेरे पास एक सेट क्लास है (यह जे 2 एमई है, इसलिए मेरे पास मानक एपीआई तक सीमित पहुंच है; बस मेरे स्पष्ट व्हील-रीइन्वेन्शन को समझाने के लिए)। मैं कक्षाओं और उप-वर्गों में चीजों के निरंतर सेट बनाने के लिए अपनी सेट कक्षा का उपयोग कर रहा हूं। यह इस तरह दिखता है ...क्या मैं उस ऑर्डर की गारंटी दे सकता हूं जिसमें जावा में स्थिर प्रारंभकर्ता चल रहे हैं?
class ParentClass
{
protected final static Set THE_SET = new Set() {{
add("one");
add("two");
add("three");
}};
}
class SubClass extends ParentClass
{
protected final static Set THE_SET = new Set() {{
add("four");
add("five");
add("six");
union(ParentClass.THE_SET); /* [1] */
}};
}
सभी ठीक दिखते हैं, [1] रेखा को छोड़कर एक शून्य सूचक अपवाद का कारण बनता है। संभवतः इसका मतलब है कि उप-वर्ग में स्थिर प्रारंभिक अभिभावक वर्ग से पहले चलाया जा रहा है। यह मुझे आश्चर्यचकित कर दिया क्योंकि मैंने सोचा होगा कि यह पहले से किसी भी नए आयात में स्थैतिक ब्लॉक चलाएगा, पहले उपनिवेश में किसी भी को चलाने से पहले।
क्या मैं इस धारणा में सही हूं? क्या इस व्यवहार के आसपास नियंत्रण या काम करने का कोई तरीका है?
अद्यतन:
चीजें भी अजनबी हैं। मैंने कोशिश की यह बजाय (ध्यान दें 'नए ParentClass()' लाइन):
class ParentClass
{
public ParentClass()
{
System.out.println(THE_SET);
}
protected final static Set THE_SET = new Set() {{
add("one");
add("two");
add("three");
}};
}
class SubClass extends ParentClass
{
protected final static Set THE_SET = new Set() {{
System.out.println("a");
new ParentClass();
System.out.println("b");
add("four");
System.out.println("c");
add("five");
System.out.println("d");
add("six");
System.out.println("e");
union(ParentClass.THE_SET); /* [1] */
System.out.println("f");
}};
}
और उत्पादन अजीब है:
a
["one", "two", "three"]
b
c
d
e
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
तो ParentClass initialised है, लेकिन उपवर्ग के लिए पहुँच नहीं है यह अपने स्थिर प्रारंभिक में।
हाँ .. यह वही काम करता है। – izb
मुझे लगता है कि एलीया इसे सही रखता है। यह initilization आदेश की समस्या नहीं है, बल्कि एक प्रकार का नाम संघर्ष है। – boutta
मेरे असली कोड में, मेरे पास वास्तव में 3 कक्षाएं हैं जहां ए <-B <-C। अपवाद बी में था। दिलचस्प बात यह है कि प्रत्येक वर्ग को अपना स्वयं का सेट नाम सी को अपवाद ले जाता है लेकिन समस्या का समाधान नहीं करता है। यह बस इंगित करता है कि आदेश वास्तव में अप्रत्याशित है। – izb