Java 写入静态字段-在这种情况下FindBugs是否错误?

Java 写入静态字段-在这种情况下FindBugs是否错误?,java,static-methods,static-members,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写入静态字段计数器。但是,如果我将代码更改为: public class Foo { public static int counter = 0;

我有这样一个Java类:

public class Foo {

    public static int counter = 0;

    public void bar(int counter) {
        Foo.counter = counter;
    }
}
FindBugs警告我不要通过实例方法
bar
写入静态字段
计数器。但是,如果我将代码更改为:

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;
}
在这个精心设计的示例中,这似乎不是一个显著的区别,特别是因为
计数器
通常可以标记为
volatile
。然而,在一个实际的例子中,setter方法具有更复杂的逻辑,并且从许多不同的地方(不仅仅是从一个实例方法)调用,后一种模式将更容易重构

另外,在我看来,插件是一个比FindBugs更快、更全面的工具

相关的:

从FindBugs列表中:

ST:从实例方法写入静态字段 (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)

此实例方法写入静态字段。这很难做到 如果正在操纵多个实例,并且通常是坏的,则正确 练习

对于通过从实例方法调用的静态方法访问静态字段,没有类似的错误描述


您可能想在FindBugs上讨论这一决定背后的基本原理,让我知道自动化工具何时能够检测到各种编程错误,这样我就可以开始寻找新的职业。但在这种情况下,这只是其中一种:P我对该工具还不熟悉,还不知道它的结果有多可靠。:)如果FindBugs发出警告,您最好查看问题。但这并不意味着如果FindBugs没有发出任何警告,那么您的代码是完美的,没有bug。CodePro AnalytiX是否在4.2(Juno)下运行?@erickson不确定……我的公司使用定制的内部版本的Eclipse,所以我有一段时间没有使用香草Eclipse了。