SonarQube - Java - 强制局部变量有效地成为最终变量
SonarQube - Java - Force local variables to be effectively final
我正在使用 SonarQube,但我找不到 Java 的任何规则来报告局部变量的重新分配(可选地还有方法参数或 class 字段,但当然不是在 setter 中),或者换句话说,强制每个局部变量成为 effectively final.
非编译示例
public Car createRedCar() {
Car car = new Car();
car.setColor(Color.RED);
car = makeCool(car); // <- error, car variable was reassigned
// do other irrelevant stuff with car, eg log, dispatch event or whatever
return car;
}
编译示例
public Car createRedCar() {
Car car = new Car();
car.setColor(Color.RED);
Car coolCar = makeCool(car); // <- it's ok, because all local variables are effectively final
// do other irrelevant stuff with car, eg log, dispatch event or whatever
return coolCar;
}
另一个编译示例
public Car createRedCar() {
final Car car = new Car();
car.setColor(Color.RED);
final Car coolCar = makeCool(car); // <- it's also ok, but i don't want to force every variable to be final
// do other irrelevant stuff with car, eg log, dispatch event or whatever
return coolCar;
}
我不想强制每个变量都有 final 关键字,只是为了让它们有效地成为 final 或 final。
如果没有默认规则,我可以使用自定义规则和/或插件,或者最后甚至写一个,但有人可能已经这样做了,这就是我在这里发帖的原因。
我正在使用sonarqube-7.4,如果它附带我想要的规则,我愿意更新。
如果有人感兴趣,我已经制定了一个规则来完成我在问题中的要求。目前,它仅在 sonarqube-8.3.1.
上进行了测试
我正在使用 SonarQube,但我找不到 Java 的任何规则来报告局部变量的重新分配(可选地还有方法参数或 class 字段,但当然不是在 setter 中),或者换句话说,强制每个局部变量成为 effectively final.
非编译示例
public Car createRedCar() {
Car car = new Car();
car.setColor(Color.RED);
car = makeCool(car); // <- error, car variable was reassigned
// do other irrelevant stuff with car, eg log, dispatch event or whatever
return car;
}
编译示例
public Car createRedCar() {
Car car = new Car();
car.setColor(Color.RED);
Car coolCar = makeCool(car); // <- it's ok, because all local variables are effectively final
// do other irrelevant stuff with car, eg log, dispatch event or whatever
return coolCar;
}
另一个编译示例
public Car createRedCar() {
final Car car = new Car();
car.setColor(Color.RED);
final Car coolCar = makeCool(car); // <- it's also ok, but i don't want to force every variable to be final
// do other irrelevant stuff with car, eg log, dispatch event or whatever
return coolCar;
}
我不想强制每个变量都有 final 关键字,只是为了让它们有效地成为 final 或 final。
如果没有默认规则,我可以使用自定义规则和/或插件,或者最后甚至写一个,但有人可能已经这样做了,这就是我在这里发帖的原因。
我正在使用sonarqube-7.4,如果它附带我想要的规则,我愿意更新。
如果有人感兴趣,我已经制定了一个规则来完成我在问题中的要求。目前,它仅在 sonarqube-8.3.1.
上进行了测试