关于Java:静态类是singleton吗?

Is a static class a singleton?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between static class and singleton pattern?

我想知道,

一个类,如Java的数学类,所有的方法都是静态的,被认为是一个单独的吗?还是一个单件必须有一个实例,例如:Math.getInstance().abs(...才有资格成为一个单件?

谢谢


类中只有静态方法不能将其限定为Singleton,因为如果其中有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不是静态类。

不,从来没有实例的类不是单例类。重要的区别在于,单例可以实现接口(甚至从抽象类派生),而如果从未创建类的实例,则任何实例方法都是无意义的。


静态类通常提供一些辅助方法。事实上,我认为比较静态类和单例类并不合适。两者完全不同。

我们可以创建一个静态类的多个实例,但是单实例保证(至少在理论上)只有一个实例。


应用单例模式的类在任何时候都在JVM上有一个或没有实例。这就是它被称为单吨的原因。拥有staticnon-static成员与单件或非单件没有关系。


单个实例保证环境中该类最多只有一个实例。它不同于一个有很多静态方法的类。单件承载状态并可以承载运行时值,而类的静态方法则不能。

您可以争辩说您可以使用静态值来实现这一点,但是静态变量的用途是不同的(有时像全局变量一样被滥用)。因此,单例方法的操作环境与静态方法不同。

单例通常还与一些资源(一些到另一个服务器的连接、对某些文件的访问等)相关联,对于这些资源,静态实例并不理想。单例还允许延迟加载(如果连接或访问资源很昂贵),而类在类加载器遇到对它们的引用时加载。


它必须有一个具有singleton含义的实例才能初始化一次。

编辑:这是维基百科文章的链接