【问题标题】:Write to static field - is FindBugs wrong in this case?写入静态字段 - 在这种情况下 FindBugs 错了吗?
【发布时间】:2012-11-03 12:57:16
【问题描述】:

我有一个这样的 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 就不会抱怨了。那不是错了吗?我仍在从实例方法写入静态字段,只是通过静态方法,不是吗?

【问题讨论】:

  • 让我知道自动化工具何时能够检测各种编程错误,这样我就可以开始寻找新的职业了。
  • 但在这种情况下它只是一种。 :P 我是那个工具的新手,还不知道它的结果有多可靠。 :)
  • 如果 FindBugs 发出警告,你最好看看问题所在。但这并不意味着如果 FindBugs 没有发出任何警告,那么您的代码就是完美且没有错误的。

标签: java static-methods static-members findbugs


【解决方案1】:

假设在未来的某个时刻,您决定此 setter 方法需要是线程安全的,并且您希望将其设为 synchronized

这段代码可以正常工作:

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 更快、更全面的工具。

相关:

【讨论】:

  • CodePro AnalytiX 是否在 4.2 (Juno) 下运行?
  • @erickson 不确定...我的公司使用自定义的内部版本的 Eclipse,所以我有一段时间不用使用普通的 Eclipse。
【解决方案2】:

来自bug descriptions的 FindBugs 列表:

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

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

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

您可能想在 FindBugs mailing list 上讨论此决定背后的理由

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多