1

在我们项目中大量使用的一个库中,有一个限制,即其类的变量不能是静态的。(它是ULC)。据我了解,这是因为需要将它们全部序列化。这条规则的问题在于它并不严格,并且可能是很难调试的错误的原因。

我们将为 Checkstyle 编写一个模块来检测此类类型的静态变量(可能由一些可定制的正则表达式检测)。我们需要知道这项检查对其他开发人员来说有多么必要。

所以问题是:当某些类型的变量绝不能是静态的时,一般情况是什么?

4

2 回答 2

1

首先,正确的面向对象设计应该通知使方法/字段静态的决定。

其次,在 Web 应用程序中,请求都在单独的线程上处理,您必须非常小心如何使用静态方法/字段。如果您的静态方法在调用之间保持任何状态(例如,通过使用静态字段来保持计数),您可能会遇到线程问题。发生这种情况是因为一个请求可能会调用静态方法,然后在执行过程中被另一个调用该方法的线程停止。如果第一次调用修改了公共资源,但没有完成,那么第二次调用可能会破坏第一次执行的进度。

于 2010-12-01T14:31:35.977 回答
0

简单的回答:如果类型以线程不安全的方式进行修改,则决不能将其用作静态实例。我怀疑这就是 ULC 建议不要以这种方式使用它们的类型的原因(不是因为序列化)。

不幸的是,用 checkstyle 之类的东西检查这个是非常困难的。例如,HashMap 不是线程安全的。但是,如果我在类加载期间构造一个实例并静态填充它,然后只在之后从映射中读取,这是 HashMap 的安全用法(因为类加载在设置时提供了外部线程安全保证,并且之后永远不会修改) .

于 2010-12-01T16:39:01.050 回答