1

可能重复:
静态类和单例模式之间的区别?

我在想,

像 Java 的 Math 类这样所有方法都是静态的类会被认为是单例吗?还是单身人士必须有一个实例,例如Math.getInstance().abs(...:)才能成为单身人士?

谢谢

4

6 回答 6

9

在一个类中只有静态方法并不限定它是 a Singleton,因为如果你有 a ,你仍然可以创建该类的尽可能多的实例public constructor

对于一个有资格的类Singleton,它应该有private constructor, 以便它不能从类外部实例化,并且有一个static factory返回same instance每次调用的。

如果您真的是说static class,那么首先,您不能将您的top-level课程设置为static。您只能拥有static nested class,在这种情况下,您不需要创建该类的任何实例,但是您可以并且可以创建多个实例,因此它不是Singleton

另外,您提到的类 -java.lang.Math不是静态类。你应该看到那个文档。

于 2012-11-27T16:53:25.070 回答
2

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.

于 2012-11-27T16:58:38.777 回答
1

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

于 2012-11-27T16:53:04.363 回答
1

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

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

于 2012-11-27T16:54:58.717 回答
0

它必须有一个具有 Singleton 意义的实例才能被初始化一次。

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

于 2012-11-27T16:52:30.920 回答
0

单例保证环境中最多只有一个该类的实例。它与具有一堆静态方法的类不同。单例携带状态并且可以携带运行时值,而类的静态方法则不携带。

您可以争辩说您可以使用静态值来执行此操作,但是静态变量的目的是不同的(有时像全局变量一样被滥用)。因此,单例在与静态方法不同的上下文中运行。

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

于 2012-11-27T16:56:17.623 回答