什么类型的变量绝不能是静态的?

时间:2010-12-01 14:20:39

标签: java static checkstyle

在我们项目中大量使用的库中,存在一个限制,即其类的变量绝不能是静态的。 (这是ULC)。据我所知,这是因为需要序列化所有这些。而这个规则的问题在于它并不严格,可能是很难调试的bug的原因。

我们将为Checkstyle编写一个模块来检测此类型的静态变量(可能由某些可自定义的regexp检测到)。我们需要知道对其他开发人员进行检查的必要性。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

简单回答:如果要以线程不安全的方式修改类型,则永远不能将该类型用作静态实例。我怀疑这就是为什么ULC建议不要这样使用他们的类型(不是因为序列化)。

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