Java Static 变量初始化
static变量初始化方式
- 直接赋值
- static块初始化
- 实例方法初始化
直接赋值
// 常量字符串
private static final String TEST = "test";
// 实例共享的变量
private static int count = 0;
直接赋值是较为常见的静态变量初始化方式,多用于常量。
static块初始化
static int count;
static{
count = initCoout();
}
private static int initCount() {
// count 初始化操作
// 返回初始化之后的值
return 1;
}
静态代码块初始化适用于逻辑较为复杂的场景,例如从配置文件中获取初始化值。
实例方法初始化
这种情况不多见,而且容易引发静态变量值互相覆盖的问题,也是因此,Sonar扫描会提示:
Makethe enclosing method “static” or remove this set
不要使用非静态方法去更新静态字段,这样很难获得正确的结果,如果有多个类实例和/或多个线程,则很容易导致错误。理想情况下,静态字段仅从同步静态方法中更新。
public class MyClass {
private static int count = 0;
public void doSomething() {
//...
count++; // Noncompliant
}
}
那现在抛给各位大佬一个问题,现在就是非理想情况下我如何在实例方法中初始化静态变量,而且不引入Sonar扫描问题?
解决方案
- 引入静态方法,在静态方法中编写初始化静态变量业务逻辑
- 实例方法调用静态方法进行初始化
这两步是为了消除引入Sonar扫描问题,其实是换汤不换药的一个方法。
目前这个问题的核心是防止静态变量被重复初始化,从而导致状态的不统一,引发计算或者业务逻辑的错误。
注意点,这个实例方法也只能调用一次,也即需要开发者保证全局调用一次,其实是可以初始化程序时,调用一次即可。