繁体   English   中英

使用java中的方法的单个实例

[英]Single instance with methods in java

我想知道编程决策 - 我认为这是风格问题。 我需要有一个只有方法而没有属性的类的单个实例。 要在java中获得它,我有两个选择:

  1. 使用静态方法创建一个抽象类,因此不可能创建该类的任何实例,这很好,
  2. 使用公共方法的单例模式。

我倾向于采用第二种方法,尽管遇到1.哪种以及为什么这些更好,或者有第三种选择。

这个单例实现一个接口是否有意义,允许你模拟这些方法用于测试目的?

我知道这些日子反对测试教条,但在某些情况下我认为静态方法很好。 如果这是一种你永远不想为了测试目的而假装的行为,并且它永远不会与其他实现一起变成多态,我认为制作一个单例并不重要。 (单身人士通常也是可测试性的敌人,尽管如果你只在代码的注入部分直接引用它们,他们就可以实现适当的接口,这样他们的单一性就不会成为问题。)

值得一提的是,C#在这种情况下具有“静态类” - 它们不仅禁止其他代码派生或实例化类,而且甚至不能将它用作参数。 基本上它非常清楚地表明意图。

我肯定建议至少有一个私有构造函数来防止外部世界的实例化。

我个人认为,该类应该包含一个私有构造函数,而不是抽象的。 摘要向读者建议某个地方有一个具体的版本,他们可能会浪费时间去寻找它。 我还要确保你有效地评论你的代码。

public class myClass {

   /** This class should never be instantiated. */
   private myClass() {
   }

   public static void myMethod() {

   }

   ...
   //etc
   ...
}

对于选项#1,限制静态实用程序类的实例化可能甚至不重要。 因为它只有静态方法而且没有状态,所以没有任何意义 - 但是没有任何伤害 - 实例化它。 类似地,静态方法不能被覆盖,因此如果它是子类,则没有意义 - 也没有区别。

如果它有任何状态 - 或者如果它有可能在某一天获得有状态 - 那么将它作为普通类实现可能会更好。 我仍然不希望将它用作Singleton,而是通过依赖注入传递其唯一的实例。 从长远来看,这使得单元测试变得更加容易。

如果它保持状态,我将使用带有私有构造函数的单例模式,因此您只能从类中实例化。 如果它没有状态,比如apache commons实用程序类,我会使用静态方法。

我从未见过静态方法的问题。 您可以将静态方法视为以某种方式破坏OO,但如果您将静态视为某种无状态的标记,它们就会非常有意义。 你可以在Java apis中找到这个,比如java.Math。 如果您担心子类化,您可以始终将其作为最终。

存在这样的危险:像这样的类可能最终成为“实用方法垃圾箱”,但只要功能不会分散太多,那么它就没有任何问题。

它也更清晰,因为没有必要像使用单例一样管理对象生命周期(并且由于没有状态,无论如何都有什么意义?)。

对于单个实例,我建议你有一个枚举,有一个实例。

但是,对于没有属性的类,您不必拥有实例。 您可以使用实用程序类。 您可以使用枚举,没有实例,只有静态方法。 注意:这不容易被嘲笑。

如果您需要在测试中模拟实现,您仍然可以实现接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM