我有一个这样的 Java 类:
public class Foo {
public static int counter = 0;
public void bar(int counter) {
Foo.counter = counter;
}
}
FindBugs 警告我通过实例方法 bar
写入静态字段 counter
。但是,如果我将代码更改为:
public class Foo {
public static int counter = 0;
public static void setCounter(int counter) {
Foo.counter = counter;
}
public void bar(int counter) {
setCounter(counter);
}
}
那么 FindBugs 就不会提示了。是不是错了?我仍在从实例方法写入静态字段,只是通过静态方法,不是吗?
最佳答案
假设在未来的某个时候,您决定此 setter 方法需要线程安全并且您希望使其同步
。
这段代码可以正常工作:
public synchronized static void setCounter(int counter) {
Foo.counter = counter;
}
public void bar(int counter) {
setCounter(counter);
}
这段代码是错误的并且会有不正确的行为:
public synchronized void bar(int counter) {
Foo.counter = counter;
}
在这个人为设计的示例中,这似乎不是一个显着差异,特别是因为 counter
通常可以标记为 volatile
。然而,在现实世界的示例中,setter 方法具有更复杂的逻辑并且从许多不同的地方调用(不仅仅是从一个实例方法),后一种模式将更容易重构。
顺便说一句,在我看来Google's CodePro Analytix插件是比 FindBugs 更快、更全面的工具。
相关:
关于java - 写入静态字段 - 在这种情况下 FindBugs 是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388829/