本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Efficient way to implement singleton pattern in Java
我有一个单例类,它作为我的应用程序的状态保护程序。例如,如果我有一个视图有一些数据,我只需将数据打包到一个保存的状态可序列化对象中,然后将其传递给我的singleton,以便稍后进行检索。这一切看起来都很自然和恰当,但我已经偏离了wiki上的单例。在拥有一个get-instance方法的集成中,该方法允许我检索实例并通过实例调用方法,相反,我只是将每个方法都设置为static并静态地使用类。
这是不好的形式吗?有表演损失吗?
谢谢你给我小费~aedon
例如,它在这里
是的,它被认为是不好的形式。
Java中的静态类有许多问题使得它们难以使用。例如,您不能实现接口。此外,如果您需要使它再次成为常规的单例(或者需要使它成为非单例,这种情况经常发生),则必须重写与之交互的每一行代码。
我认为根据经验,更改为非单例将需要重构每一行,因为访问单例最常见的方法是mysingleton.getInstance().someMethod()。不是我对其他问题有异议,只是那个特定的问题。
如果静态使用满足您的需求,我看不出其中有什么坏处。
唯一的缺点是灵活性稍差。如果将其设计为实际的单例,那么可以有一个用于管理状态的接口,并为特定情况实例化特定的实现。然后可以将此对象作为参数传递到应用程序中。
使用一个严格的静态类,没有要传递的对象,因此您必须使用传递类对象并通过该接口访问函数。
当然,所有这些只有在有任何可能扩展到当前类的合理能力之外时才重要。
嗯,很有趣。谢谢您。我使用静态模式的原因之一是为了方便访问(这是一种说懒惰设计的奇特方式)。如果我更深入地研究一个应用程序,并且我意识到访问一些数据有点麻烦,那么我发现只使用全静态类会更容易。
嗯,让它成为一个单例应该只需要在每次使用中添加一行代码。也就是说,不是"foo=single.getfoo();"而是"single=single.getIntance();foo=single.getfoo();"。如果您只需要单例中的一个字段,它只会使一行稍长一些,比如"foo=single.getInstance().getfoo();",这对于长期灵活性来说似乎是一个相当小的代价。
是的,只使用静态方法和变量不是面向对象的方法。单身通常被认为是一种坏习惯。不过,我承认有时候它们很有用。下面是一个简单的例子,说明如何创建一个有效的、功能性强的单例类。注意还有其他的方法,但这是最常见的方法之一…
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
多余的代码发布…
谢谢,但我知道辛格尔顿是如何做到的,我只是好奇静态的做事方式是否不那么有效。
如果@aedonetila不确定如何编写一个singleton,并且只使用静态方法,那么这又有什么必要呢?
@伊多内特拉好吧-我不是从你的问题中得到的…)欢呼
添加到@boris'注释中,如果您只需要一个实用程序类,那么使用枚举更简单
public enum Utility {
; // no instances
public static Object myStaticMethod(Object ... args) { }
}
如果您有一个要实现的接口,那么这一个单例就有意义了。注意,可以使用枚举创建多个单例
public enum Callables implements Callable {
HELLO {
public String call() { return"Hello"; }
},
WORLD {
public String call() { return"World"; }
}
}
注意:Hello和World共享一个超类可调用文件,但实际上有不同的类。
它被认为是不好的形式,因为它不是面向对象的样式。很多人认为单身汉的身体状况很差。坦率地说,这对你想做的事情是很好的。除非你要把这个呈交审查或评估,否则我就不提了。
作为静态类,性能可能会更好。
就我个人而言,我从来没有被"它是坏的,因为它不是面向对象的"的论点所说服过。我的反应是,"那又怎样?"每当某件事的理由是,"因为所有的专家都这么说"或"因为教科书就是这么说的",我就把它理解为"我真的不知道为什么"。
使用枚举而不是singleton。这是最安全的方法。
你能不能更一般一点?你的措词都错了。
@小兔子-同意。@鲍里斯-我不完全确定我会遵守。
@Edonetlira,@boris想说的是,enum单例模式是首选的单例实现。
-1这可能是真的,但这是一个评论(关于一个副本),而不是一个新的答案。
@小兔子,我明白了。谢谢你的澄清。