为什么从Java中的实例方法写入静态字段不好?

时间:2012-07-04 08:15:31

标签: java synchronization static-members

我在SO中找到了一篇文章,讨论了防止从实例方法写入静态字段所需的代码更改,但为什么这样做不是一个好习惯呢?为什么Java设计者会允许这样做?换句话说,为什么编译器在尝试执行此操作时不会抛出错误?

3 个答案:

答案 0 :(得分:12)

用'findbugz'文件的话来说:

  

此实例方法写入静态字段。如果正在操纵多个实例,这很难得到正确的解决方法。

这也就是说它并不总是错误的,只是它通常是错误的来源。操作静态字段的实例对象可用于例如共享对象的延迟初始化,因此它并不总是错误的,但它很难正确(特别是如果多个线程可能同时运行)。

答案 1 :(得分:0)

除了上述内容之外,从文档的角度来看,如果您使用表单,则很容易让某人认为它是一个实例字段:

someField = null

myObj.someField = null

使用表格

myClass.someField = null

使它更清晰并阻止findbugz警告(显然,我还没有测试过)。请注意,这不会阻止所描述的多线程问题。

答案 2 :(得分:0)

它可能很有用,例如,如果你有一个管理蚂蚁的应用程序,你需要能够访问ant类中创建的蚂蚁总数。 这可以通过写入静态方法来完成,该方法在每次创建新的ant时都会跟踪蚂蚁的总数写入静态方法addAnt();