您可以更改它以满足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 );
}
}
“不应在构造函数中更新静态字段” 我需要在静态上下文中使用该变量!
答案 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并部署一个静态初始化程序块。