Bazı insanlar sordu: singleton nasıl bir boş gösterici döndürür?
Bu soruyu cevaplıyorum. (Bir yorumda cevap veremiyorum çünkü kod göndermem gerekiyor.)
İki olay arasında null değeri döndürebilir: (1) sınıf yüklenir ve (2) bu sınıfın nesnesi oluşturulur. İşte bir örnek:
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);
}
}
Kodu çalıştıralım:
$ javac A.java
$ java A
x:X@a63599 y:Y@9036e
x:null y:null
İkinci hat gösterir Y.xinstance ve X.yinstance olan boş ; bunlar boştur, çünkü X.xinstance ve Y.yinstance değişkenleri null olduğunda okunur.
Bu düzeltilebilir mi? Evet,
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);
}
}
ve bu kod anomali göstermez:
$ javac A.java
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e
ANCAK bu Android Application
nesnesi için bir seçenek değildir : programcı oluşturulduğu zamanı kontrol etmez.
Bir kez daha: ilk örnek ile ikincisi arasındaki fark, ikinci örneğin statik işaretçi boşsa bir örnek oluşturmasıdır. Ama bir programcı oluşturamıyor sistem bunu yapmaya karar önce Android uygulama nesnesi.
GÜNCELLEME
Başlatılan statik alanların olduğu bir şaşırtıcı örnek daha 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());
}
}
Ve şunu elde edersiniz:
$ javac Main.java
$ java Main
first: FIRST second: SECOND
first: <FIRST> second: <SECOND>
first: nullFIRSTnull second: nullSECONDnull
Statik değişken bildirimini bir satır üste taşıyamayacağınızı, kodun derlenmeyeceğini unutmayın.
<application>
şu özellik tanımını eklemek üzere AndroidManifest.xml dosyasının düğümünü:android:name="MyApp"
. Uygulamam, bildiriminizin başvurduğu paketin altında olmalıdır.