Java 静态方法还是单例方法,选择哪一种?
可能重复:Java 静态方法还是单例方法,选择哪一种?,java,android,design-patterns,static,singleton,Java,Android,Design Patterns,Static,Singleton,可能重复: Java中哪个更好 实现公共静态方法,如 Factory.createLoginRequest() 或者实现单例模式,比如 Factory.getInstance().createLoginRequest() (两者都将返回一个请求对象。) 哪一个更好?为什么?这要看情况而定 选择单例,因为: 一般来说,我认为单例稍微整洁一些,因为它允许您在(私有)构造函数中/从中初始化单例对象 当后来决定此对象不再是单一对象时(由于新的见解或新的需求),重构它就更容易了:您只需要更改获取实
Java中哪个更好 实现公共静态方法,如
Factory.createLoginRequest()
或者实现单例模式,比如
Factory.getInstance().createLoginRequest()
(两者都将返回一个请求对象。)
哪一个更好?为什么?这要看情况而定
选择单例,因为:
- 一般来说,我认为单例稍微整洁一些,因为它允许您在(私有)构造函数中/从中初始化单例对象李>
- 当后来决定此对象不再是单一对象时(由于新的见解或新的需求),重构它就更容易了:您只需要更改获取实例的所有位置,而不是所有对静态方法的调用
- 在android的特定情况下,您可能更喜欢静态方法来提高性能-我怀疑调用静态函数可能比在单例对象上调用方法快一点(对于编译器来说更容易优化)
视情况而定。没有更多细节,这个问题就无法客观地回答。顺便说一句,现在在Java中实现单例的流行方法是使用枚举,看看它对继承没有什么帮助。@Tom所以你认为
Factory.createLoginRequest()
可能具有与Factory.getInstance()相同的上下文相关的动态行为
?是的,您只需要在更简单的API后面使用继承。在singleton中,您不能扩展该类,因为构造函数是私有的,因此您不能拥有除该类提供的实例之外的另一个对象。实际上,如果您愿意,您可以使singleton类可扩展。只需将构造函数设置为受保护的而不是私有的,然后就可以使用受保护的构造函数(或者如果它是最终类,则设置私有构造函数)来创建子类。然后,子类有自己的getInstance()方法覆盖超类的getInstance()方法。`我怀疑调用静态函数可能会快一点',为什么?基本上,因为'Singleton'是一种模式,而不是Java语言中嵌入的东西,JVM将必须执行“在对象上调用方法”逻辑/基础结构(精确查找应该调用的代码,因为该方法可能已被重写等)。对于静态函数的调用,它总是可以跳过所有这些,并且可能会跳过更多的优化,因为它可以做出更多/更容易的假设。其中一些可能会被“优化掉”,但在android中,您仍然需要自己在代码中进行大部分优化。