Possible Duplicate:
Difference between static class and singleton pattern?
我想知道,
一个类,如Java的数学类,所有的方法都是静态的,被认为是一个单独的吗?还是一个单件必须有一个实例,例如:Math.getInstance().abs(...才有资格成为一个单件?
谢谢
- 值得注意的是,不管它是否有资格成为单身汉,它实际上是全球性的,这使得它受到了大多数针对单身汉的批评,所有其他事物都是平等的。
- 请参阅上一个线程:stackoverflow.com/questions/519520/…
- 你真的是指static class还是使用静态方法的类?
- 由于可以保存对对象唯一静态可访问实例的引用,因此可以将Math.class视为单例。不能保存对Math的引用,也不能在该实例上调用方法。
类中只有静态方法不能将其限定为Singleton,因为如果其中有public constructor,您仍然可以创建该类的任意多个实例。
对于一个符合Singleton条件的类,它应该有private constructor,这样它就不能从类外部实例化,并且有一个static factory,它每次调用时都返回same instance。
如果你的意思是static class,那么首先,你不能把top-level类当作static类。您只能使用static nested class,在这种情况下,您不需要创建该类的任何实例,但是您可以并且可以创建多个实例,因此它不是Singleton。
另外,您提到的类-java.lang.Math不是静态类。您应该看到它的文档。
- -1一般来说,这不是关于类的,而是关于静态类的。
- @德尔南。嗯,我认为OP是在用静态方法讨论类,正如他提到的Math类。而且我们不能将top-level类作为静态类。所以,可能是欧普没有把自己的头衔框清楚。
- @德尔南。我想你可以取消投反对票,正如我在回答中引用的。
- 这对我来说似乎很清楚(但我又不是爪哇人)。在我看来,"静态类"不需要同时使用关键字static class。它只是一个没有实例的类,不管是如何实现的(例如,final类上未使用的private构造函数)。编辑:这里的答案表明,在Java专家中,这个术语被用来引用EDCOX1的任何2项。如果是这样的话,我的错,尽管我仍然认为很明显OP使用了我描述的术语。
- @德尔南:对于爪哇的所有其他概念,你都会把"静态X"关联为"X与静态修饰符"。因此,术语"静态类"最适合声明为"静态类foo"的类。是的,OP误用了这个术语——Java中没有"没有可访问的构造函数,没有实例成员,没有创建实例的类"的术语。
- @德尔南。好吧,static class实际上是写为static class的,但是它们嵌入到一些顶级类中。
Java中的静态类只是嵌套类,它们不是内部类。(例如,它们不像C中的静态类。)它们仍然可以有实例方法、状态等,并且可以有多个实例。
java.lang.Math不是静态类。
不,从来没有实例的类不是单例类。重要的区别在于,单例可以实现接口(甚至从抽象类派生),而如果从未创建类的实例,则任何实例方法都是无意义的。
静态类通常提供一些辅助方法。事实上,我认为比较静态类和单例类并不合适。两者完全不同。
我们可以创建一个静态类的多个实例,但是单实例保证(至少在理论上)只有一个实例。
- Java中的静态类只是嵌套的非内部类。你完全可以实例化它们,它们可以有状态等等。
- 同意,乔恩;这就是为什么我用"通常"这个词的原因。
- 不是在第一部分,你没有:你声称"静态类只是提供了一些辅助方法,并没有被实例化";这完全不是真的。
- 现在你的答案有部分矛盾。在第一条语句中,您说不能实例化静态类,在编辑过程中,您颠倒了您的声明。
- 我是…然后相应地更新你的答案。有一个赞成票的答案(我不知道怎么回答)是没有意义的,这与它本身是矛盾的。
应用单例模式的类在任何时候都在JVM上有一个或没有实例。这就是它被称为单吨的原因。拥有static或non-static成员与单件或非单件没有关系。
- 我不知道体重跟这个有什么关系…(明白了吗?单吨?我觉得很有趣……)
- @Nathansabruka谢谢你,伙计=)
单个实例保证环境中该类最多只有一个实例。它不同于一个有很多静态方法的类。单件承载状态并可以承载运行时值,而类的静态方法则不能。
您可以争辩说您可以使用静态值来实现这一点,但是静态变量的用途是不同的(有时像全局变量一样被滥用)。因此,单例方法的操作环境与静态方法不同。
单例通常还与一些资源(一些到另一个服务器的连接、对某些文件的访问等)相关联,对于这些资源,静态实例并不理想。单例还允许延迟加载(如果连接或访问资源很昂贵),而类在类加载器遇到对它们的引用时加载。
它必须有一个具有singleton含义的实例才能初始化一次。
编辑:这是维基百科文章的链接