代码气味sonarLint-为静态字段分配值

时间:2018-06-29 12:01:00

标签: java spring-boot

您可以更改它以满足sonarLint吗?如果我不执行赋值操作,则我的变量的值为null ...

@SpringBootApplication
public class BwsApplication {
    private static ConfigClass config;

    public BwsApplication(ConfigClass configClass) {
        config = configClass;//SONAR - Remove this assignment of "config"
    }

    public static void main(String[] args) throws SQLException {
        SpringApplication.run(BwsApplication.class, args);
        Connection con = config.getConnection();
        int number = StudentsManager.getStudentsNumber(con);
        QuartzApp qa = new QuartzApp(config);
        qa.excecution(number );
    }
}

“不应在构造函数中更新静态字段” 我需要在静态上下文中使用该变量!

2 个答案:

答案 0 :(得分:3)

该类用@SpringBootApplication注释。
作为记录,以下是Spring Boot在创建bean应用程序期间调用的构造函数:

public BwsApplication(ConfigClass configClass) {
    config = configClass;//SONAR - Remove this assignment of "config"
}

由此类表示的SpringBootApplication将被实例化一次,并且只有一次。因此,从逻辑角度来看,将此字段设为static字段似乎并非无效。但是实际上,将其设置为static或否都没有关系,因为它将与不超过一个实例共享。通过将其设置为static,您将一无所获。
我认为您创建了字段static是因为您将在static主方法中使用它。
但这不是这样做的方法。
相反,请删除static修饰符,并将此代码移动到实例@PostConstruct方法中,该方法将在对此bean执行依赖注入之后执行:

Connection con = config.getConnection();
int number = StudentsManager.getStudentsNumber(con);
QuartzApp qa = new QuartzApp(config);
qa.excecution(number );

通过这种方式,即使它是实例字段,也可以引用config字段。

它看起来像:

@SpringBootApplication
public class BwsApplication {

    private  ConfigClass config;

    public BwsApplication(ConfigClass configClass) {
        config = configClass;//SONAR - Remove this assignment of "config"
    }

    public static void main(String[] args) throws SQLException {
        SpringApplication.run(BwsApplication.class, args);       
    }

    @PostConstruct
    private void postConstruct() {
      Connection con = config.getConnection();
      int number = StudentsManager.getStudentsNumber(con);
      QuartzApp qa = new QuartzApp(config);
      qa.excecution(number);
    }
}

答案 1 :(得分:1)

此代码看起来很奇怪,SonarLint是正确的报告代码气味的方法。您的字段int32被声明为static,即config的所有实例都共享它。每个构造函数调用都需要一个新的BwsApplication实例并覆盖ConfigClass字段,这可能不是您想要的。

您可以通过使用某些静态方法进行分配来解决此问题,例如:

static

您的构造函数将不再需要public class BwsApplication { private static ConfigClass config; ... public static final void init(final ConfigClass configClass) { config = configClass; } } 类型的参数。


如果您可以在编译时确定ConfigClass的实例,则可以启动JohnSnowDoesNotKnowNothing's solution并部署一个静态初始化程序块。


仅排除可能性:请确保您没有将staticfinal混淆。