【问题标题】:FindBugs error: Write to static field from instance methodFindBugs 错误:从实例方法写入静态字段
【发布时间】:2014-01-15 11:32:43
【问题描述】:

我的应用程序中有几个区域在从实例方法操作静态变量的值时出现错误。

“从实例方法写入静态字段”

如果我们不考虑多线程,即使多个实例写入同一个static 变量,这种情况是否会带来任何潜在问题?

【问题讨论】:

  • 检查这个 SO 问题stackoverflow.com/q/3630485/1686291
  • 我特别想知道什么时候不涉及线程,如果这种情况可能会产生任何问题..一些解释会很好。

标签: java static code-analysis findbugs


【解决方案1】:

来自文档...

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

  • 首先它说这是一种不好的做法,并非不正确。
  • 第二件事是关于提出任何潜在问题的问题

    如果您从实例方法操作static 字段,则任何类(包含我们的实例方法的类)的对象都可能正在调用该方法,并且在某些情况下很难找出操作static 字段的对象大型应用程序或已由他人开发和编码的应用程序。

This Answer 也可以帮到你。

编辑:

仅供参考,您可以在以下代码中绕过 findbug 的警告。

class TestClass {

     static int testInt = 0 ;

     public static setTestInt ( int a ) {
          TestClass.testInt = a ;
     }

     public void setInt ( int a1 ) {
          setTestInt ( a1 ); 
     }
}

【讨论】:

  • 所以,我猜在单线程环境中,这应该不是问题,对吧?
  • 不,有时可以。我认为你没有正确理解最后一段?
  • 我的意思是,如果静态变量是单线程的,那么静态变量引用的数据的完整性是否存在任何潜在问题?顺便感谢您的及时回复。
  • 这就是我一直在寻找的......现在我只是想了解数据完整性将如何受到损害。例如。在单线程场景下,如果多个实例作用于这段代码,就不可能同时执行,rt?(因为没有线程)。因此,每个实例一个接一个地作用于代码,最后变量将具有最后一个实例设置的任何值。因此,无论实例开始使用的静态字段的值如何,它都不会在两者之间更改,因为没有并行执行。那么这里的数据完整性是如何受到影响的呢?
  • 感谢您的回复。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多