कुछ लोगों ने पूछा है: सिंगलटन एक अशक्त सूचक को कैसे लौटा सकता है?
मैं उस सवाल का जवाब दे रहा हूं। (मैं एक टिप्पणी में जवाब नहीं दे सकता क्योंकि मुझे कोड पोस्ट करने की आवश्यकता है।)
यह दो घटनाओं के बीच में अशक्त हो सकता है: (1) कक्षा भरी हुई है, और (2) इस वर्ग का उद्देश्य बनाया गया है। यहाँ एक उदाहरण है:
class X {
static X xinstance;
static Y yinstance = Y.yinstance;
X() {xinstance=this;}
}
class Y {
static X xinstance = X.xinstance;
static Y yinstance;
Y() {yinstance=this;}
}
public class A {
public static void main(String[] p) {
X x = new X();
Y y = new Y();
System.out.println("x:"+X.xinstance+" y:"+Y.yinstance);
System.out.println("x:"+Y.xinstance+" y:"+X.yinstance);
}
}
चलो कोड चलाते हैं:
$ javac A.java
$ java A
x:X@a63599 y:Y@9036e
x:null y:null
दूसरी पंक्ति से पता चलता है कि Y.xinstance और X.yinstance हैं अशक्त ; वे शून्य हैं क्योंकि चर X.xinstance ans Y.yinstance को तब पढ़ा गया था जब वे शून्य थे।
क्या इसे ठीक किया जा सकता है? हाँ,
class X {
static Y y = Y.getInstance();
static X theinstance;
static X getInstance() {if(theinstance==null) {theinstance = new X();} return theinstance;}
}
class Y {
static X x = X.getInstance();
static Y theinstance;
static Y getInstance() {if(theinstance==null) {theinstance = new Y();} return theinstance;}
}
public class A {
public static void main(String[] p) {
System.out.println("x:"+X.getInstance()+" y:"+Y.getInstance());
System.out.println("x:"+Y.x+" y:"+X.y);
}
}
और यह कोड कोई विसंगति नहीं दिखाता है:
$ javac A.java
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e
लेकिन यह एंड्रॉइड Application
ऑब्जेक्ट के लिए एक विकल्प नहीं है : प्रोग्रामर उस समय को नियंत्रित नहीं करता है जब इसे बनाया जाता है।
एक बार फिर: पहले उदाहरण और दूसरे के बीच का अंतर यह है कि दूसरा उदाहरण एक उदाहरण बनाता है यदि स्थिर सूचक शून्य है। लेकिन एक प्रोग्रामर नहीं बना सकते एंड्रॉयड आवेदन वस्तु से पहले प्रणाली यह करने के लिए फैसला किया।
अपडेट करें
एक और अधिक चौंकाने वाला उदाहरण जहां प्रारंभिक स्थिर क्षेत्र होते हैं null
।
मुख्य.जावा :
enum MyEnum {
FIRST,SECOND;
private static String prefix="<", suffix=">";
String myName;
MyEnum() {
myName = makeMyName();
}
String makeMyName() {
return prefix + name() + suffix;
}
String getMyName() {
return myName;
}
}
public class Main {
public static void main(String args[]) {
System.out.println("first: "+MyEnum.FIRST+" second: "+MyEnum.SECOND);
System.out.println("first: "+MyEnum.FIRST.makeMyName()+" second: "+MyEnum.SECOND.makeMyName());
System.out.println("first: "+MyEnum.FIRST.getMyName()+" second: "+MyEnum.SECOND.getMyName());
}
}
और आपको मिलता है:
$ javac Main.java
$ java Main
first: FIRST second: SECOND
first: <FIRST> second: <SECOND>
first: nullFIRSTnull second: nullSECONDnull
ध्यान दें कि आप स्थैतिक चर घोषणा को एक पंक्ति ऊपरी नहीं ले जा सकते, कोड संकलित नहीं करेगा।
<application>
निम्नलिखित विशेषता को शामिल करने के लिए अपनी AndroidManifest.xml फ़ाइल के नोड को संशोधित कर सकते हैंandroid:name="MyApp"
। MyApp को उसी पैकेज के तहत होना चाहिए, जो आपके मैनिफ़ेस्ट को संदर्भित करता है।