Beberapa orang bertanya: bagaimana mungkin singleton mengembalikan pointer nol?
Saya menjawab pertanyaan itu. (Saya tidak bisa menjawab dalam komentar karena saya perlu mengirim kode.)
Ini dapat mengembalikan nol di antara dua peristiwa: (1) kelas dimuat, dan (2) objek kelas ini dibuat. Ini sebuah contoh:
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);
}
}
Mari kita jalankan kodenya:
$ javac A.java
$ java A
x:X@a63599 y:Y@9036e
x:null y:null
Baris kedua menunjukkan bahwa Y.xinstance dan X.yinstance adalah null ; mereka nol karena variabel X.xinstance ans Y.yinstance dibaca ketika mereka nol.
Bisakah ini diperbaiki? Iya,
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);
}
}
dan kode ini tidak menunjukkan anomali:
$ javac A.java
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e
TAPI ini bukan opsi untuk Application
objek Android : programmer tidak mengontrol waktu ketika itu dibuat.
Sekali lagi: perbedaan antara contoh pertama dan yang kedua adalah bahwa contoh kedua menciptakan sebuah instance jika pointer statis adalah nol. Tapi programmer tidak dapat membuat satu objek aplikasi Android sebelum sistem memutuskan untuk melakukannya.
MEMPERBARUI
Satu lagi contoh membingungkan di mana bidang statis yang diinisialisasi terjadi 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());
}
}
Dan Anda mendapatkan:
$ javac Main.java
$ java Main
first: FIRST second: SECOND
first: <FIRST> second: <SECOND>
first: nullFIRSTnull second: nullSECONDnull
Perhatikan bahwa Anda tidak dapat memindahkan deklarasi variabel statis satu baris ke atas, kode tidak akan dikompilasi.
<application>
node file AndroidManifest.xml untuk menyertakan definisi atribut berikut:android:name="MyApp"
. MyApp harus di bawah paket yang sama dengan referensi manifes Anda.