当我看到一个被记录为线程安全的类时,我想知道为什么它不是设计为带有所有静态方法的实用程序类,如java.lang.Math等。
每当我在类似没有状态但在单个类中使用链式方法设计类时,我都缺少有效的驱动力。
示例1 :具有“线程安全字段”S的A类怎么样;我的意思是,对象'S'本身是线程安全的。我们可以声明类A中S的所有方法和字段都是静态的。
我希望我的解释足够清楚。请澄清。
注意:排除javabeans,属性持有类等。我的问题是关于基于输入参数执行某些操作的类,他们可能也需要使用其他类。
我很抱歉我编辑了这个问题。初稿完全不明确。
答案 0 :(得分:3)
我可以很容易想象一个类需要具有状态的情况,但它也是线程安全的要求。例如,我使用队列作为工作线程。 HAS 是线程安全的,肯定必须有状态。 (即队列中的元素)
编辑:
注意:排除javabeans,属性保持类等。我的问题是关于基于输入参数执行某些操作的类,他们可能也需要使用其他类。
如果你的意思是你的问题是关于真正无国籍的课程,那么 - 按照定义 - 你的观察是正确的。这些几乎总是用静态实用程序类表示。
EDIT2:
我认为你有点误导了这个事实,很多时候我们看到static
我们可以放松线程安全。 (虽然并非在每种情况下都是如此,只是一个经验法则)虽然线程安全和无状态可以在某种程度上齐头并进,但静态是一个正交的概念。此外,无状态确实可以为您提供线程安全,但线程安全并不一定意味着无状态。如果是这种情况,则synchronized
的整个概念将是不必要的。
答案 1 :(得分:0)
可测试性,因为static
适合OO,就像拳头适合鼻子一样。
可测试代码要求您可以以受控方式创建测试对象。我不想只是因为它是从我正在测试的对象中的某个地方调用而执行某人的代码。我想孤立地测试我的对象 - 假设它的合作者工作正常。使用某些工具的静态方法使我使用PowerMock进行可测试性或亲吻隔离再见,并在我测试时执行该代码。 Powermock是一个问题(因为它使用它自己的类加载器),因此测试的次数超出了我的预期。
静态意味着程序代码。这有点好,因为程序很有时候很好。但是,当不使用static
时,尝试使用静态方法的OO功能(继承,多态)来找到另一个原因。
这个简单的例子说明了这一点:http://www.javaworld.com/javaworld/javaqa/2001-05/01-qa-0504-oo.html?page=1 - 绝不是详尽无遗的,但显示了我希望的观点。
其他例子列在@JB Nizet对上述答案的评论中。
我知道这是一个迟到的答案,但老实说,我在使用静态方法测试对象时遇到了很多问题,这些方法来自'无实例'类和通常广受欢迎的解决方案,即PowerMock。