为了寻求更多意见,我重写了这个问题(我正在学习如何提问,英语不是我的母语)......
将所有方法和全局变量保持为静态是多余的还是最佳实践?(我的意思是本身只有一个实例)
如果这些方法都不依赖于类的状态(实例属性),那么您不需要单例,只需将它们全部声明为static
- 然后您将拥有一个实用程序类(这是问题中提出的第二种方法)。
另一方面,如果方法确实依赖于类的状态,并且您必须确保在任何时候都只存在一个类的实例,那么请使用单例(这是问题中建议的第一种方法)。
请注意,第二种方法实际上并不被视为单例,根据定义,单例是一种“用于实现单例的数学概念,通过将类的实例化限制为一个对象”的模式,并且具有所有方法的类static
不会根本不需要实例化。
编辑 :
关于在单例类中调用静态方法,在对象实例上调用静态方法被认为是不好的风格,不管它是否是单例。这已在以前的帖子中广泛讨论过。因此,为了保持一致性,我认为最好将单例中的所有方法声明为 non- static
,即使它们不依赖于实例属性,并通过单例访问所有方法(您问题中的第一种方法) .
如果一个类使用任何资源或者初始化一个单例的成本很高,通常是值得的。
单例将使您更好地控制对象的生命周期。保证在访问任何静态方法之前调用静态构造函数,但是没有办法强制静态构造函数再次运行。
单例对象更容易测试,没有办法在静态方法上拥有接口。
单例可以很容易地转换为另一种实现模式,可能是资源池而不是单个对象。
具有实例方法的单例相对于具有静态方法的类的优点是它可以
这有很大的不同,特别是如果你想根据这个单例对方法进行单元测试:你可以传递另一个实现相同接口的单例模拟实例。
我认为这是一个“哲学问题”。
如果它只是我经常调用的一种方法,并且没有对单例的其他调用,我更喜欢第二种方式。
MyClass.doSomethingElse()
如果您可以使用静态方法解决问题,那么就这样做。由于您不需要获取单例实例,因此编写起来更简单、更短。但是,这些是您需要 Singleton 的典型情况:
要点是,如果您需要任何这些或类似的东西,您就会知道为什么静态实用程序类不适用。然后升级到单例。