3

当我看到一个记录为线程安全的类时,我想知道为什么它没有被设计成一个具有所有静态方法(如 java.lang.Math 等)的实用程序类。

每当我在没有状态但在单个类中链接方法的场景中设计一个类时,我都缺少有效的驱动力。

示例 1:具有“线程安全字段”S 的类 A 怎么样?我的意思是,对象“S”本身是线程安全的。我们可以将类 A 中的所有方法和字段(如 S)声明为静态的吗?

我希望我的解释足够清楚。请澄清。

注意:排除 javabean、属性持有类等。我的问题是关于基于输入参数执行某些操作的类,它们可能还需要使用其他类。

我很抱歉我编辑了这个问题。初稿完全模棱两可。

4

2 回答 2

3

我可以很容易地想象一个类需要有状态的情况,但它也是线程安全的要求。例如,我将队列用于工作线程。它必须是线程安全的,并且肯定必须有状态。(即队列中的元素)

编辑:

注意:排除 javabean、属性持有类等。我的问题是关于基于输入参数执行某些操作的类,它们可能还需要使用其他类。

如果你的意思是你的问题是关于真正的无状态类,那么 - 根据定义 - 你的观察是正确的。这些几乎总是可以在静态实用程序类中表示。

编辑2:

我认为你被这样一个事实误导了,很多时候我们看到static我们可以放松线程安全。(尽管并非在所有情况下都如此,这只是一个经验法则)虽然线程安全和无状态可以在某种程度上齐头并进,但静态是一个正交概念。此外,无状态确实为您提供线程安全,但线程安全并不一定意味着无状态。如果是这样的话,整个概念synchronized就没有必要了。

于 2012-06-28T21:24:46.207 回答
0

为了可测试性,并且因为static像拳头适合鼻子一样适合 OO。

可测试代码要求您可以以受控方式创建测试对象。我不想仅仅因为它是从我正在测试的对象中的某个地方调用的,就必须执行某人的代码。我想单独测试我的对象 - 假设它的合作者工作正常。使用来自某些工具的静态方法使我使用 PowerMock 进行可测试性或吻隔离再见并在我测试时执行该代码。Powermock 是一个问题(因为它使用自己的类加载器),所以测试比我想要的要多。

静态意味着程序代码。有时这很好,因为程序有时很好。但是尝试将 OO 特性(继承、多态)与静态方法一起使用,以便在不使用static. 说明这一点的简单示例:http ://www.javaworld.com/javaworld/javaqa/2001-05/01-qa-0504-oo.html?page= 1 - 并非详尽无遗,但显示了我希望的观点。@JB Nizet 对上述答案的评论中列出了其他示例。

我知道这是一个迟到的答案,但老实说,我在使用“无实例”类的静态方法和通常受欢迎的解决方案(即 PowerMock)测试对象时遇到了相当多的问题。

于 2013-12-03T16:49:44.257 回答