java - 写入静态字段 - 在这种情况下 FindBugs 是错误的吗?

标签 java static-methods static-members findbugs

我有一个这样的 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/

相关文章:

c++ - 使用 decltype 定义静态成员(Intellisense 不同意)

java - 如何查找给定文本的html元素

java - JBoss Fuse Hibernate 集成

Python 静态方法并不总是可调用的

java - 静态与非静态 Activity Intent 调用方法

java - 静态内部类和类的静态成员共享同名?

c++ - 静态成员必须初始化?

c++ - 静态成员函数

java - 如果方法的参数是先前设置的变量而不是直接输入,为什么该方法会返回不同的值?

java - java中字段初始化的过程