可能重复:
静态类和单例模式之间的区别?
我在想,
像 Java 的 Math 类这样所有方法都是静态的类会被认为是单例吗?还是单身人士必须有一个实例,例如Math.getInstance().abs(...
:)才能成为单身人士?
谢谢
可能重复:
静态类和单例模式之间的区别?
我在想,
像 Java 的 Math 类这样所有方法都是静态的类会被认为是单例吗?还是单身人士必须有一个实例,例如Math.getInstance().abs(...
:)才能成为单身人士?
谢谢
在一个类中只有静态方法并不限定它是 a Singleton
,因为如果你有 a ,你仍然可以创建该类的尽可能多的实例public constructor
。
对于一个有资格的类Singleton
,它应该有private constructor
, 以便它不能从类外部实例化,并且有一个static factory
返回same instance
每次调用的。
如果您真的是说static class
,那么首先,您不能将您的top-level
课程设置为static
。您只能拥有static nested class
,在这种情况下,您不需要创建该类的任何实例,但是您可以并且可以创建多个实例,因此它不是Singleton
。
另外,您提到的类 -java.lang.Math
不是静态类。你应该看到那个文档。
Java中的静态类只是不是内部类的嵌套类。(例如,它们不像 C# 中的静态类。)它们仍然可以有实例方法、状态等 - 并且可以有多个实例。
java.lang.Math
不是静态类。
And no, a class which never has an instance is not a singleton. The important difference is that a singleton can implement an interface (or even derive from an abstract class) whereas if you never create an instance of a class, any instance methods are pointless.
应用单例模式的类在 JVM 上任何时候都有一个或没有实例。这就是为什么它被称为单吨。拥有static
或non-static
成员与单身或非单身没有关系。
静态类通常提供一些辅助方法。事实上,我认为将静态类与单例类进行比较并不合适。两者完全不同。
我们可以创建一个静态类的多个实例,但单例保证(至少在理论上)只有一个实例。
它必须有一个具有 Singleton 意义的实例才能被初始化一次。
编辑:这是维基百科文章的链接
单例保证环境中最多只有一个该类的实例。它与具有一堆静态方法的类不同。单例携带状态并且可以携带运行时值,而类的静态方法则不携带。
您可以争辩说您可以使用静态值来执行此操作,但是静态变量的目的是不同的(有时像全局变量一样被滥用)。因此,单例在与静态方法不同的上下文中运行。
单例通常还与某些资源(与另一台服务器的某些连接,对某些文件的访问等)相关联,而静态实例对于这些资源来说并不是那么理想。单例还允许延迟加载(如果连接或访问资源很昂贵),而当类加载器遇到对它们的引用时,类会被加载。