java小白的学习记录......
本文主题:慎用静态域成员变量
1. 如下程序是一个单例模式,程序输出值是我们想要的结果:
实例:
import java.util.*;
public class Elvis
{
public static final Elvis INSTANCE = new Elvis();
private final int beltSize;
private static final int CURRENT_YEAR = 1930;
private Elvis()
{
System.out.println("构造函数");
beltSize = CURRENT_YEAR-1930;
}
public int beltSize()
{
return beltSize;
}
public static void main(String[] args)
{
System.out.println("Elvis gets beltSize "+INSTANCE.beltSize());
}
}
结果:
解释:
类在加载的时候,会首先初始化静态域,然后初始化构造函数。
首先初始化静态域,CURRENT_YEAR初始化为1930;
再初始化private Elvis()构造函数,beltSize被计算。
2. 将上面实例的蓝色部分改为:
private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);
结果:
不是我们想要的结果,CURRENT_YEAR值是0。
解释(不知对否,尚属小白一只):
在构造函数里,对beltSize进行赋值。
第1行:第1个静态域在初始化INSTANCE时,new Elvis()会触发构造函数private Elvis(),beltSize被计算;
此时,第3行的第2个静态域还没有被初始化(Calendar.getInstance().get(Calendar.YEAR)也是一个静态函数,而Calendar类还未被初始化),CURRENT_YEAR就会使用默认值0;
导致beltSize的值为非预期值。