Java 线程安全类与所有静态方法的实用类

Java 线程安全类与所有静态方法的实用类,java,oop,design-patterns,object-oriented-analysis,Java,Oop,Design Patterns,Object Oriented Analysis,当我看到一个被记录为线程安全的类时,我想知道为什么它没有被设计成一个包含所有静态方法(如java.lang.Math等)的实用类 每当我在一个类中设计一个类时,我就失去了有效的驱动力,比如在一个类中没有状态,只有链式方法 示例1:具有“线程安全字段”的a类如何;我的意思是,对象本身是线程安全的。我们可以将类A中的所有方法和字段(如S)声明为静态的吗 我希望我的解释足够清楚。请澄清 注意:排除JavaBean、属性持有类等。。我的问题是关于基于输入参数执行某些操作的类,它们可能还需要使用其他类 很

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

每当我在一个类中设计一个类时,我就失去了有效的驱动力,比如在一个类中没有状态,只有链式方法

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

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

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


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

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

编辑:

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

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

编辑2:


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

用于可测试性,因为
静态
适合OO就像拳头适合鼻子一样。

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

静态意味着程序代码。这有时很好,因为程序有时很好。但是,尝试将OO特性(继承、多态性)与静态方法结合使用,以便在不使用
static
时找到另一个原因。 简单的例子说明了这一点:-并非详尽无遗,但表明了我希望的观点。 @JB Nizet对上述答案的评论中列出了其他示例


我知道这是一个迟来的答案,但老实说,我在使用来自“无实例”类的静态方法和通常寻求的解决方案(又名PowerMock)测试对象时遇到了很多问题。

计时器
为例-您将实例特定的状态存储在哪里?(一个计时器与另一个不同。没有任何属性并不意味着没有状态。)感谢您的回复。是的,我意识到我的问题有点模棱两可。我实际上关注的是不需要任何状态的类,我不会说它们总是可以用静态实用程序类来表示。通常,它们需要扩展抽象类或实现接口、实例化、存储和在对象之间传递。以Collections.EMPTY_列表为例。线程安全,无状态,但必须是列表。大多数Comparator实现也是如此。@Firefox:您能更新这个问题,给出一个类的例子吗?这个类被证明是线程安全的,但没有状态?计时器是个坏例子。@JBNizet:谢谢你的更正,我修改了我的答案accordingly@JonSkeet是的,我明白。我在找一个。我用一个坏例子完全歪曲了我的怀疑。