Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态方法还是单例方法,选择哪一种?_Java_Android_Design Patterns_Static_Singleton - Fatal编程技术网

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的特定情况下,您可能更喜欢静态方法来提高性能-我怀疑调用静态函数可能比在单例对象上调用方法快一点(对于编译器来说更容易优化)

视情况而定。单例概念考虑了对象初始化的限制。换句话说,singleton对象必须是运行时中singleton类的唯一实例。但是,如果您只需要创建一些类家族的对象,那么就使用工厂方法模式。

我会选择单例,因为它允许您使用Java面向对象的功能,如继承(方法重写),这对静态方法不起作用。

来自wikipedia:

请注意类的简单静态实例和单一实例之间的区别:尽管单一实例可以作为静态实例实现,但它也可以延迟构造,在需要之前不需要内存或资源。另一个显著的区别是静态成员类不能实现接口,除非该接口只是一个标记。因此,如果类必须实现由接口表示的契约,那么它实际上必须是一个单例


视情况而定。没有更多细节,这个问题就无法客观地回答。顺便说一句,现在在Java中实现单例的流行方法是使用枚举,看看它对继承没有什么帮助。@Tom所以你认为
Factory.createLoginRequest()
可能具有与
Factory.getInstance()相同的上下文相关的动态行为
?是的,您只需要在更简单的API后面使用继承。在singleton中,您不能扩展该类,因为构造函数是私有的,因此您不能拥有除该类提供的实例之外的另一个对象。实际上,如果您愿意,您可以使singleton类可扩展。只需将构造函数设置为受保护的而不是私有的,然后就可以使用受保护的构造函数(或者如果它是最终类,则设置私有构造函数)来创建子类。然后,子类有自己的getInstance()方法覆盖超类的getInstance()方法。`我怀疑调用静态函数可能会快一点',为什么?基本上,因为'Singleton'是一种模式,而不是Java语言中嵌入的东西,JVM将必须执行“在对象上调用方法”逻辑/基础结构(精确查找应该调用的代码,因为该方法可能已被重写等)。对于静态函数的调用,它总是可以跳过所有这些,并且可能会跳过更多的优化,因为它可以做出更多/更容易的假设。其中一些可能会被“优化掉”,但在android中,您仍然需要自己在代码中进行大部分优化。