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保持警惕吧,毕竟即使你注意到了这种情况,也不代码你接手的代码里没有。
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保持警惕吧,毕竟即使你注意到了这种情况,也不代码你接手的代码里没有。
相关文章推荐
- Java中static变量的初始化顺序
- Java的static修饰变量,方法,代码块的初始化顺序
- Java中的static变量、方法、代码块初始化执行顺序
- java中static变量与非static变量初始化顺序
- [转] Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- Java类中构造方法的执行顺序和变量初始化
- Java - Static和Final修饰类属性变量及初始化
- Java中变量、类初始化顺序
- java对象中继承和变量初始化顺序浅析
- 【转】Java类的初始化顺序 (静态变量、静态初始化块、变量
- static 变量初始化顺序的问题和解决方案
- java 变量的初始化顺序
- java成员变量的初始化顺序
- java变量,初始化快,构造函数的执行顺序
- java变量初始化顺序
- 浅谈Java变量的初始化顺序详解
- 【转】Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- 关于JAVA Static的初始化顺序(及递归错误)
- Java基础 构造对象初始化变量的顺序浅见
- JAVA变量初始化顺序