静态类是单例吗? [复制]

Posted

技术标签:

【中文标题】静态类是单例吗? [复制]【英文标题】:Is a static class a singleton? [duplicate] 【发布时间】:2012-11-15 08:39:12 【问题描述】:

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

我在想,

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

谢谢

【问题讨论】:

请注意,无论它是否符合单例的条件,它实际上都是全局的,这使得它受到了大多数针对单例的批评,所有其他条件都相同。 查看上一个帖子:***.com/questions/519520/… 您的意思是static class,还是带有静态方法的类? Math.class 可以被视为单例,因为您可以保存对对象的唯一静态可访问实例的引用。您无法保存对 Math 的引用并调用该实例上的方法。 【参考方案1】:

一个类中只有静态方法并不符合Singleton的条件,因为如果你有一个public constructor,你仍然可以创建该类的尽可能多的实例。

对于一个符合Singleton 的类,它应该有private constructor,这样它就不能从类外部实例化,并且有一个static factory,每次调用都会返回same instance

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

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

【讨论】:

-1 这不是关于一般的类,而是关于静态类。 @delnan.. 好吧,我认为 OP 是在谈论具有静态方法的类,正如他提到的 Math 类。而且我们不能将top-level 类作为静态类。所以,可能是 OP 没有清楚地框定他的标题。 @delnan.. 我认为您可以删除您的反对票,因为我在回答中引用了这件事。 这对我来说似乎很清楚(但话又说回来,我不是 Java 人)。在我看来,“静态类”不需要一起使用关键字static class。它只是一个没有实例的类,不管它是如何实现的(例如 final 类上未使用的 private 构造函数)。编辑:这里的答案表明,在 Java 专家中,该术语指的是 static class 所做的任何事情。如果是这样,我的错,尽管我仍然认为 OP 确实使用了我所描述的术语。 @delnan:对于 Java 中的所有其他概念,您会将“静态 X”关联为“带有静态修饰符的 X”。因此,术语“静态类”最适合声明为“静态类 Foo”的类。是的,OP 滥用了这个术语——Java 中根本没有术语来表示“一个没有可访问的构造函数、没有实例成员且无法创建实例的类”。【参考方案2】:

Java 中的静态类只是嵌套类,不是内部类。 (例如,它们不像 C# 中的静态类。)它们仍然可以有实例方法、状态等 - 并且可以有多个实例。

java.lang.Math 不是静态类。

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

【讨论】:

【参考方案3】:

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

【讨论】:

我不知道这与重量有什么关系...(明白吗?单吨?好吧,我觉得这很有趣...) @NathanSabruka 谢谢老兄=)【参考方案4】:

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

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

【讨论】:

Java 中的静态类只是嵌套的非内部类。您绝对可以实例化它们,它们可以具有状态等。 同意乔恩;这就是为什么我使用“通常”这个词 不是在第一部分你没有:你声称“静态类只是提供一些帮助方法并且没有被实例化”;这根本不是真的。 现在你的答案有一些相互矛盾的部分。在第一条语句中你说你不能实例化静态类,而在编辑中,你推翻了你的主张。 @rai.skumar.. 然后相应地更新您的答案。有一个赞成的答案没有意义(我不知道如何),自相矛盾。【参考方案5】:

它必须有一个具有 Singleton 含义的实例,只能初始化一次。

编辑:Here's a link to the Wikipedia article

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于静态类是单例吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

49期面试官:SpringMVC的控制器是单例的吗?

设计模式之单例模式

PHP 单例模式

什么是单例模式(下)

注入 Guice 的 DAO 应该是单例吗?

moment.js 是单例吗?