java singleton class vs final class

时间:2016-11-28 18:30:27

标签: java design-patterns

有人可以在java singleton设计模式类vs java final class上清楚地解释一下。

我们可以使用final类而不是使用单例类吗?

对于最后一个类,我们可以创建类的实例并使用其中的方法,但不覆盖属性,如果方法在final类中是静态的,那么我们可以调用像ClassName.getMethod这样的方法,为什么我们应该去单身而不是最后一堂课吗?

5 个答案:

答案 0 :(得分:8)

最后一堂课是无法延期的。您可以在最终课程中拥有任意数量的实例。最终课程的最佳示例是String。 Singleton是类的单个实例。所以两者并不完全相同,但是你可以让你的单例类最终限制某人扩展它。

答案 1 :(得分:2)

您无法扩展最终类,单例类只有一个实例。因此继承概念不适用于最终类。但是你可以在最终课程中创建任意数量的实例,但是你不能在Singleton中创建。

  

,即final类是不可变类,可以创建多个实例但是Singleton类只有单个实例。

答案 2 :(得分:1)

单例是一个类,在程序的所有生命周期中都有一个实例。但是最后一堂课,你可以拥有它的多个实例。问题是你不能从最终的类中继承,但没有什么能阻止你拥有它的很多实例。

答案 3 :(得分:0)

单身类通常与ClassLoader绑定。基本上,每个JVM应该有一个。 final课程是您无法继承的课程,但仅仅因为它final并不代表您无法拥有多个实例({1}}每个JVM)。

请注意,当我说每个JVM 时,我正在谈论,例如,部署.class文件中的.war文件一次;如果多次部署相同的Web应用程序,则每个Web应用程序都会获得自己的单例

答案 4 :(得分:-1)

我认为你的问题更多的是静态与单身。作为最后一个类在这个上下文中是不相关的,因为你不能覆盖静态方法(你当然可以在扩展中定义相同的签名静态方法,但这将是无关紧要的,因为在调用的意义上,biding仍然是“静态的” SuperClass.getMethod将始终从SuperClass调用该定义。这是一个经典问题,我相信你可以在其他地方找到答案。但是,为了给你一个简短的答案,我想说使用单例允许你实现接口并像任何其他对象一样传递你的单例对象。

也许我可以解释,对于任何给我-1的人,我的意思是什么(我认为这很清楚)。最初的问题是关于单身人士与决赛。但当他解释时,他明确表示他将使用静态方法。他没有意识到,在方法属于单个类的意义上使方法独特的原因是它们是静态的,因此类方法而不是实例方法。作为最终结果没有任何效果:用户可以根据自己的需要实例化,这只能阻止他扩展课程,而这似乎不是我提出问题的真正关注点。 另一方面,他明确表示他将在最后一堂课中使用静态方法。这似乎表明他希望通过使用静态方法使它成为一个单例:这是一种经典的方法,并且之前已经提出过使用静态方法与单例的问题。例如,请参阅Why use a singleton instead of static methods?Difference between static class and singleton pattern? 当我写下覆盖静态方法的时候,我尝试解释静态方法在它们不参与动态绑定的意义上并没有真正被覆盖。举个例子,如果你有一个带有静态方法foo()的类A,然后类B扩展了类A并重新定义了静态foo(),那就没问题。但是在对象obj上调用foo()会调用属于obj类型的静态方法,即使你在运行时为它分配了一个不同的对象(这就是我所谓的静态绑定)。换句话说,如果你声明“一个obj = new B()”并调用obj.foo()它仍然会调用A.foo() 我不知道这个解释是否有帮助,我希望无论谁给我-1解释了原因。