2010-12-01 56 views
1

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

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

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

+0

你的意思是变量吗?没有像“静态实例”这样的概念。 – 2010-12-01 14:23:17

+0

是的,谢谢你的纠正。 – 2010-12-01 14:31:04

回答

1

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

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

+0

我同意但实际上适当的OOA/OOD授权你永远不会使用Java的idiosynchratic * static *。它不存在于OOA/OOD级别,并且它始终是OOA/OOD - > OOP转换错误,以便使用语言的idiosynchrasies而不是正确的转换。有人可能认为他需要Java的静态,但你真的不需要:任何OOA/OOD都可以使用* static *关键字在没有** EVER **的情况下转换为Java。正如任何OOA/OOD都可以正确,清晰地转换为没有* static *概念的OO语言。 – SyntaxT3rr0r 2010-12-01 16:18:23

0

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

不幸的是,用类似checkstyle的东西来检查它非常困难。作为一个例子,HashMap不是线程安全的。然而,如果我构造一个实例并在类加载期间静态地填充它,然后只从之后的地图读取,这是HashMap的安全用法(因为classloading在安装时提供了外部线程安全保证,之后它不会被修改) 。

相关问题