Java Static 变量初始化

Java Static 变量初始化

static变量初始化方式

  1. 直接赋值
  2. static块初始化
  3. 实例方法初始化

直接赋值

// 常量字符串
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扫描问题?

解决方案

  1. 引入静态方法,在静态方法中编写初始化静态变量业务逻辑
  2. 实例方法调用静态方法进行初始化

这两步是为了消除引入Sonar扫描问题,其实是换汤不换药的一个方法。
目前这个问题的核心是防止静态变量被重复初始化,从而导致状态的不统一,引发计算或者业务逻辑的错误。
注意点,这个实例方法也只能调用一次,也即需要开发者保证全局调用一次,其实是可以初始化程序时,调用一次即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值