當年,某國際巨星的“龍種”曝光,眾人指責他對不起嬌妻,逼得他出面召開記者會,向世人自白他犯了“全世界所有男人都會犯的錯誤”。從來沒犯過這種錯誤的我,也因此經常認為自己不是個男人。
雖然沒犯過“全世界所有男人都會犯的錯誤”,但是我倒是曾經犯了“全世界所有程序員都會犯的錯誤”。不管使用何種語言,全世界所有程序員都一定犯過這種錯誤,那就是:太依靠編譯器,卻不知道編譯器做了哪些事。class Singleton
{
private static Singleton
obj = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getInstance()
{
return obj;
}
}
public class MyMain {
public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1=="+obj.counter1);
System.out.println("obj.counter2=="+obj.counter2);
}
}
class Singleton
{
private static Singleton obj;
public static int counter1;
public static int counter2;
static
{
// 這就是class constrUCtor
// 在進入此class constructor之前,class已經被JVM
// 配置好內存,所有的static field都會被先設定為0,
// 所以此時counter1和counter2都已經是0,
且singleton為null
obj = new Singleton();
// 問題皆由此行程序產生
// counter1不會在此被設定為0
counter2 = 0;
// counter2再被設定一次0(其實是多此一舉)
}
private Singleton()
{
// 這是instance constructor
counter1++;
counter2++;
}
public static Singleton getInstance()
{
return obj;
}
}