3

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

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

4

5 回答 5

2

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

另一方面,如果方法确实依赖于类的状态,并且您必须确保在任何时候都只存在一个类的实例,那么请使用单例(这是问题中建议的第一种方法)。

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

编辑 :

关于在单例类中调用静态方法,在对象实例上调用静态方法被认为是不好的风格,不管它是否是单例。这已在以前的帖子中广泛讨论过。因此,为了保持一致性,我认为最好将单例中的所有方法声明为 non- static,即使它们不依赖于实例属性,并通过单例访问所有方法(您问题中的第一种方法) .

于 2012-05-08T11:49:44.693 回答
1

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

  1. 单例将使您更好地控制对象的生命周期。保证在访问任何静态方法之前调用静态构造函数,但是没有办法强制静态构造函数再次运行。

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

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

于 2012-05-08T11:58:25.113 回答
1

具有实例方法的单例相对于具有静态方法的类的优点是它可以

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

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

于 2012-05-08T11:59:23.610 回答
0

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

如果它只是我经常调用的一种方法,并且没有对单例的其他调用,我更喜欢第二种方式。

MyClass.doSomethingElse()
于 2012-05-08T11:49:31.883 回答
0

如果您可以使用静态方法解决问题,那么就这样做。由于您不需要获取单例实例,因此编写起来更简单、更短。但是,这些是您需要 Singleton 的典型情况:

  • 延迟初始化;
  • 多态性(动态调度——在运行时决定你想要哪种行为,实现现有接口,模拟测试,......);
  • 与单例的全局不同的范围(可能基于每个线程)。

要点是,如果您需要任何这些或类似的东西,您就会知道为什么静态实用程序类不适用。然后升级到单例。

于 2012-05-08T11:56:35.350 回答