Proper singleton design?
Possible Duplicate:
Efficient way to implement singleton pattern in Java
我有一个单例类,它作为我的应用程序的状态保护程序。例如,如果我有一个视图有一些数据,我只需将数据打包到一个保存的状态可序列化对象中,然后将其传递给我的singleton,以便稍后进行检索。这一切看起来都很自然和恰当,但我已经偏离了wiki上的单例。在拥有一个get-instance方法的集成中,该方法允许我检索实例并通过实例调用方法,相反,我只是将每个方法都设置为static并静态地使用类。
这是不好的形式吗?有表演损失吗?
谢谢你给我小费~aedon
是的,它被认为是不好的形式。
Java中的静态类有许多问题使得它们难以使用。例如,您不能实现接口。此外,如果您需要使它再次成为常规的单例(或者需要使它成为非单例,这种情况经常发生),则必须重写与之交互的每一行代码。
如果静态使用满足您的需求,我看不出其中有什么坏处。
唯一的缺点是灵活性稍差。如果将其设计为实际的单例,那么可以有一个用于管理状态的接口,并为特定情况实例化特定的实现。然后可以将此对象作为参数传递到应用程序中。
使用一个严格的静态类,没有要传递的对象,因此您必须使用传递类对象并通过该接口访问函数。
当然,所有这些只有在有任何可能扩展到当前类的合理能力之外时才重要。
是的,只使用静态方法和变量不是面向对象的方法。单身通常被认为是一种坏习惯。不过,我承认有时候它们很有用。下面是一个简单的例子,说明如何创建一个有效的、功能性强的单例类。注意还有其他的方法,但这是最常见的方法之一…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Singleton { private static final Singleton uniqueInstance; public static synchronized Singleton getInstance() { if (Singleton.uniqueInstance == null) { Singleton.uniqueInstance = new Singleton(); } return Singleton.uniqueInstance; } //other methods go here... @Override protected Singleton clone() throws CloneNotSupportedException() { throw new CloneNotSupporedException("cloning of singleton is not supported"); } //hide constructor for others to see private Singleton() { } } |
喝彩,P
添加到@boris'注释中,如果您只需要一个实用程序类,那么使用枚举更简单
1 2 3 4 |
如果您有一个要实现的接口,那么这一个单例就有意义了。注意,可以使用枚举创建多个单例
1 2 3 4 5 6 7 8 |
注意:Hello和World共享一个超类可调用文件,但实际上有不同的类。
它被认为是不好的形式,因为它不是面向对象的样式。很多人认为单身汉的身体状况很差。坦率地说,这对你想做的事情是很好的。除非你要把这个呈交审查或评估,否则我就不提了。
作为静态类,性能可能会更好。
使用枚举而不是singleton。这是最安全的方法。