单个静态类是单身吗?

时间:2012-11-27 16:51:20

标签: java static singleton

  

可能重复:
  Difference between static class and singleton pattern?

我在想,

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

由于

6 个答案:

答案 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 实例。这就是为什么它被称为单吨。拥有staticnon-static成员与 singleton 非单身无关。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

它必须有一个Singleton实例意味着只能初始化一次。

修改:Here's a link to the Wikipedia article

答案 5 :(得分:0)

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

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

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