您的位置:首页 > 编程语言 > Java开发

Java static变量初始化顺序引发的bug

2017-04-21 11:49 225 查看
听说过很多道理,写代码时还是会犯错。使用static变量时注意其初始化顺序是:

1. 按书写顺序将static变量先赋默认值。

2. 刷完上一遍后,还要再刷第二遍,第二遍才赋值。

所以下面的代码就未能按本意运行:

public class TestSeq {

private static TestSeq instance = new TestSeq();
private static boolean firstFlag = true;

private TestSeq() {
if(firstFlag) {
System.out.println("Flag is true, do something...");
} else {
System.out.println("Flag is false, nothing to do.");
}
}
public static TestSeq getInstance() {
return instance;
}

public boolean getFirstFlag() {
return firstFlag;
}

public static void main(String[] args) {
TestSeq seq = TestSeq.getInstance();
System.out.println("Get flag: "+seq.getFirstFlag());
}
}

运行结果是:
Flag is false, nothing to do.

Get flag: true

在刷第二遍赋值时,TestSeq的instance先被构造,而在构造方法里使用firstFlag时,firstFlag还是默认值,所以在TestSeq的构造方法里打印“Flag is false..."。

上面的代码也许很容易发现这个问题,但代码量大,或者去修改别人的代码时,就容易走眼了。所以,尽量不要让静态变量出现相互或交叉引用,不然捋一遍初始化顺序也很费劲。还是要提醒自己对static保持警惕吧,毕竟即使你注意到了这种情况,也不代码你接手的代码里没有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: