java - 如何在 Java 中安全地写入静态字段?

标签 java static warnings instance findbugs

假设我有一个创建对象并使用静态变量跟踪对象数量的类。像这样:

public class Apple {
    private static int count = 0;

    public Apple () {
        count++;
    } 

    public void removeApple() {
        count--;
    }
}

当我使用 FindBugs 检查此代码时,我收到警告 Write to static field from instance method,这当然很明显。

我怎样才能解决这个问题并使其更安全,甚至摆脱 FindBugs 警告?

最佳答案

1。一般编程建议

这条消息是为了警告您一个潜在的编程错误,因为对于不了解静态变量和实例变量范围差异的初学者程序员来说,这是一个常见的陷阱。 p>

但是,如果您可以声明removeApple 方法的真实版本static 而不会导致任何编译器错误,那么您很可能应该这样做。这既会处理警告,又会明确表明此方法与您的类的任何特定实例无关。

2。与并发相关的问题

此警告的另一方面涉及线程安全。如果您从实例写入 static 字段,则可能会从不同的线程进行并发更新,即使线程之间没有共享类实例也是如此。

如果您的代码不需要线程安全(一般情况下这完全没问题),那么您无需执行任何操作。如果确实需要,则同步该字段的所有更新,或使用 AtomicInteger 包装器。

就我个人而言,我会选择 AtomicInteger,因为它是最安全的选择:其他选项需要您跟踪类周围的所有字段更新并确保它们是同步的。使用 AtomicInteger 非常简单:

private static final AtomicInteger count = new AtomicInteger();

然后您使用 count.getAndIncrement() 而不是 count++

关于java - 如何在 Java 中安全地写入静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422691/

相关文章:

java - 用于排除注释的 AspectJ 切入点

Java fireTableDataChanged() 不更新 JTable

c++ - 在具有静态对象的类的析构函数中使用 exit(),不会像预期的那样进入无限循环

eclipse - 忽略 Eclipse 项目中的所有警告

c - 警告 : Suspicious pointer-to-pointer conversion (area too small) with lint

JavaFX:如何在 XY 线图的 Y 轴上正确实现 `getValueForDisplay()`?

java - 为什么我们不应该从另一个公共(public)调用公共(public)方法?

static - 在页面之间共享数据的最佳实践

java - Java 静态方法的标准?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP