可能重复:
Difference between static class and singleton pattern?
我在想,
像Java的Math类这样的所有方法都是静态的类会被认为是单例吗?或者单身人士是否必须拥有一个实例,例如:Math.getInstance().abs(...
)才有资格成为单身人士?
由于
答案 0 :(得分:7)
在类中使用静态方法并不能使其成为Singleton
,因为如果您有一个public constructor
,您仍然可以创建该类的多个实例。
对于符合Singleton
条件的类,它应该具有private constructor
,因此无法从类外部实例化,并且static factory
返回same instance
1}}每次调用。
如果您的意思是static class
,那么首先,您不能将top-level
课程设为static
。您只能拥有static nested class
,在这种情况下您不需要创建该类的任何实例,但您可以创建多个实例,因此它不是Singleton
。
此外,您提到的课程java.lang.Math
不是静态课程。你应该看到它的文档。
答案 1 :(得分:2)
Java中的静态类只是嵌套类,其中不是内部类。 (例如,它们不像C#中的静态类。)它们仍然可以有实例方法,状态等 - 并且可以有多个实例。
java.lang.Math
不是一个静态类。
不,从来没有实例的类不是单例。一个重要的区别是单例可以实现一个接口(甚至可以从一个抽象类派生),而如果你从不创建一个类的实例,那么任何实例方法都是毫无意义的。
答案 2 :(得分:1)
应用Singleton Pattern的类在JVM上随时都有 one或none 实例。这就是为什么它被称为单吨。拥有static
或non-static
成员与 singleton 或非单身无关。
答案 3 :(得分:1)
静态类通常提供一些辅助方法。事实上,我认为将静态类与Singleton进行比较是不合适的。两者完全不同。
我们可以创建静态类的多个实例,但是singleton保证(理论上至少)只有单个实例。
答案 4 :(得分:0)
它必须有一个Singleton实例意味着只能初始化一次。
答案 5 :(得分:0)
单例保证环境中最多只有一个该类的实例。它与具有一堆静态方法的类不同。单例包含状态并且可以携带运行时值,而类的静态方法则不包含运行时值。
你可以说你可以有静态值来做到这一点,但静态变量的目的是不同的(有时像全局变量一样被滥用)。因此,单例操作在与静态方法不同的上下文中运行。
单例也通常与某些资源(某些连接到另一台服务器,访问某些文件等)相关联,而静态实例则不是那么理想。单例还允许延迟加载(如果连接或访问资源很昂贵),而类加载器在类加载器遇到对它们的引用时会加载。