我想知道编程决策 - 我认为这是风格问题。 我需要有一个只有方法而没有属性的类的单个实例。 要在java中获得它,我有两个选择:
我倾向于采用第二种方法,尽管遇到1.哪种以及为什么这些更好,或者有第三种选择。
答案 0 :(得分:4)
该单例实现接口是否有意义,允许您为测试目的模拟这些方法?
我知道这些日子反对测试教条,但在某些情况下我认为静态方法很好。如果这是一种你永远不想为了测试目的而假装的行为,并且它永远不会与其他实现一起变成多态,我认为制作一个单例并不重要。 (单身人士通常也是可测试性的敌人,尽管如果你只是在代码的注入部分直接引用它们,他们就可以实现适当的接口,这样他们的单一性就不会成为问题。)
值得一提的是,C#在这种情况下有“静态类” - 它们不仅禁止其他代码派生或实例化类,而且甚至不能将它用作参数。基本上它非常清楚地表明意图。
我肯定建议至少使用私有构造函数来阻止外部世界的实例化。
答案 1 :(得分:2)
我个人认为该类应该包含一个私有构造函数,而不是抽象的。摘要向读者建议某个地方有一个具体的版本,他们可能会浪费时间去寻找它。我还要确保你有效地评论你的代码。
public class myClass {
/** This class should never be instantiated. */
private myClass() {
}
public static void myMethod() {
}
...
//etc
...
}
答案 2 :(得分:1)
对于选项#1,限制静态实用程序类的实例化可能甚至不重要。因为它只有静态方法而且没有状态,所以没有任何意义 - 但是没有任何伤害 - 实例化它。类似地,静态方法不能被覆盖,因此如果它是子类,它就没有意义 - 也没有区别。
如果它有任何状态 - 或者如果有一天它有可能获得有状态 - 那么将它作为普通类实现可能会更好。我仍然不希望将它用作Singleton,而是通过依赖注入传递其唯一的实例。从长远来看,这使得单元测试变得更加容易。
答案 3 :(得分:1)
如果它保持状态,我将使用带有私有构造函数的单例模式,因此您只能在类中实例化。如果它没有状态,比如apache commons实用程序类,我会使用静态方法。
答案 4 :(得分:0)
我从未见过静态方法的问题。您可以将静态方法视为以某种方式破坏OO,但如果您将静态视为某种无状态的标记,它们就会非常有意义。你可以在Java apis中找到这个,比如java.Math。如果你担心子类化,你总是可以把它作为最终的。
像这样的类可以最终成为“实用方法垃圾箱”的危险,但只要功能没有太大分歧,那么它就没有任何问题。
它也更清晰,因为没有必要像对待单身一样管理对象生命周期(并且由于没有状态,无论如何都有什么意义?)。
答案 5 :(得分:0)
对于单个实例,我建议你有一个枚举,有一个实例。
但是,对于没有属性的类,您不必拥有实例。您可以使用实用程序类。您可以使用枚举,没有实例,只有静态方法。注意:这不容易被嘲笑。
如果你需要在测试中模拟实现,你仍然可以实现一个接口。