어떤 사람들은 싱글 톤이 어떻게 널 포인터를 반환 할 수 있습니까?
나는 그 질문에 대답하고있다. (코드를 게시해야하므로 의견에 답할 수 없습니다.)
두 이벤트 사이에 null을 반환 할 수 있습니다. (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 가 null 임을 나타냅니다 . 변수 X.xinstance ans Y.yinstance 가 null 일 때 읽혀 지기 때문에 null입니다.
이 문제를 해결할 수 있습니까? 예,
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
그러나 이것은 Android Application
객체 의 옵션이 아닙니다 . 프로그래머는 생성 시간을 제어하지 않습니다.
다시 한 번 : 첫 번째 예제와 두 번째 예제의 차이점은 두 번째 예제는 정적 포인터가 널인 경우 인스턴스를 작성한다는 것입니다. 그러나 프로그래머는 만들 수 없습니다 시스템이 그것을 할하기로 결정하기 전에 안드로이드 응용 프로그램 개체를.
최신 정보
초기화 된 정적 필드가 발생하는 또 하나의 수수께끼 예 null
입니다.
Main.java :
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은 매니페스트가 참조하는 것과 동일한 패키지에 있어야합니다.