一部の人々は尋ねました:シングルトンはどのようにnullポインターを返すことができますか?
私はその質問に答えています。(コードを投稿する必要があるため、コメントには回答できません。)
2つのイベントの間に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
2行目は、Y.xinstanceとX.yinstanceがnullであることを示しています。変数のため、彼らはnullでX.xinstance ANS Y.yinstanceは、彼らが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
オブジェクトのオプションではありません。プログラマは、オブジェクトが作成される時間を制御しません。
ここでも、最初の例と2番目の例の違いは、静的ポインタがnullの場合、2番目の例がインスタンスを作成することです。ただし、システムが作成する前に、プログラマーは Androidアプリケーションオブジェクトを作成できません。
更新
初期化された静的フィールドが偶然に発生するもう1つの不可解な例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
静的変数宣言を1行上に移動できないことに注意してください。コードはコンパイルされません。
<application>
に、AndroidManifest.xmlファイルのノードを変更して、次の属性定義を含めることができますandroid:name="MyApp"
。MyAppは、マニフェストが参照するのと同じパッケージの下にある必要があります。