给出一个Singleton:需要静态方法和变量?

时间:2012-05-08 11:46:09

标签: java static singleton instances

在寻求更多意见的过程中,我重写了这个问题(我正在学习如何提问,英语不是我的母语)......

将所有方法和全局变量保持为静态是多余的还是最佳做法? (我的意思是本身只有一个实例)

5 个答案:

答案 0 :(得分:2)

如果这些方法都不依赖于类的状态(实例属性),那么您不需要单例,只需将它们全部声明为static - 您将拥有一个实用程序类(这是问题中提出的第二种方法。)

另一方面,如果方法取决于类的状态,并且您必须确保在任何时刻只存在该类的一个实例,那么使用单例(这是问题中提出的第一种方法。)

请注意,第二种方法并不真正被视为单例,definition单例是一种“用于实现单例的数学概念的模式,通过将类的实例化限制为一个对象“,并且具有所有 - static方法的类根本不需要实例化

编辑:

关于在单例类中调用静态方法,在对象实例上调用静态方法被认为是不好的样式,如果它是单例,则无关紧要。这已在之前的posts中进行了广泛讨论。因此,为了保持一致性,我认为最好将单例中的所有方法声明为非static,即使它们不依赖于实例属性,也可以通过单例访问所有方法(第一个)处理你的问题)。

答案 1 :(得分:1)

如果一个类使用任何资源或者初始化单例成本很高,通常是值得的。

  1. 单身人士可以更好地控制对象的生命周期。保证在访问任何静态方法之前调用静态构造函数,但是无法强制静态构造函数再次运行。

  2. 单例对象更容易测试,没有办法在静态方法上设置接口。

  3. 单例可以很容易地转换为另一种实现模式,可能是资源池而不是单个对象。

答案 2 :(得分:1)

使用实例方法的单例与使用静态方法的类的优点是它可以

  • 扩展另一个类
  • 实现接口
  • 作为参数传递给方法

这会产生很大的不同,特别是如果你想根据这个单例单元测试方法:你可以传递另一个实现相同接口的单例的模拟实例。

答案 3 :(得分:0)

我认为这是一个“哲学问题”。

如果它只是我经常打电话的方法而没有其他单打电话,我更喜欢第二种方式。

MyClass.doSomethingElse()

答案 4 :(得分:0)

如果您可以使用静态方法解决问题,那就这样做吧。写入更简单,更短,因为您不需要获取单例实例。但是,这些是您想要单身人士的典型案例:

  • 懒惰初始化;
  • 多态(动态调度 - 在运行时确定您需要的行为,实现现有接口,模拟测试,......);
  • 与单例不同的范围(可能基于每个线程)。

重点是,如果您需要其中任何一个或类似的东西,您就会知道为什么静态实用程序类不适用。然后升级到Singleton。