我有一个单例类,可以充当我的应用程序的状态保护程序。例如,如果我有一个包含某些数据的视图,我只是将数据保存到已保存的状态可序列化对象,然后将其传递给我的单例以便稍后进行检索。这一切看似自然而恰当,但我偏离了Wiki上的单例示例。有一个get实例方法的Intead将让我检索实例并通过实例调用方法,我只是将每个方法设置为静态并静态使用该类。
这是不好的形式?表演会失败吗?
感谢任何提示~Aedon
答案 0 :(得分:4)
如果静态使用满足了你的需求,我看不到任何邪恶。
唯一的缺点是它的灵活性稍差。如果将其设计为实际单例,则可以使用用于管理状态的接口,并针对特定情况实例化特定实现。然后可以将此对象作为参数传递给您的应用程序。
使用严格的静态类,没有传递对象,所以你不得不求助于传递Class对象并通过该接口访问函数。
当然,所有这一切都很重要,如果这有可能超出你当前班级的合理能力。
答案 1 :(得分:4)
是的,它被认为是不好的形式。
Java中的静态类存在许多难以使用的问题。例如,您无法实现接口。此外,如果您需要再次使其成为常规单身人士 - 或者需要使其成为非单身人士(经常发生) - 您将不得不重写与其交互的每一行代码。
答案 2 :(得分:1)
是的,仅使用静态方法和变量不是面向对象的方式。 单身人士通常被认为是一种不好的做法。但是,我承认它们有时非常有用。这是一个如何创建有效且功能强大的Singleton类的简单示例。请注意,还有其他方法,但这是最常见的...
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
答案 3 :(得分:0)
Use Enum instead of Singleton。这是最安全的方式。
答案 4 :(得分:0)
它被认为是不好的形式,因为它不是面向对象的风格。许多人认为单身人士形式不佳。坦率地说,它会对你正在尝试做的事情很好。除非您打算将其提交给我进行审核或评估,否则我会不管它。
作为静态类,性能可能会更好。
答案 5 :(得分:0)
添加到@Boris'评论,如果你需要的只是一个Utility类,它使用枚举更简单
public enum Utility {
; // no instances
public static Object myStaticMethod(Object ... args) { }
}
如果你有一个实现的接口,这个单例是有意义的。注意,您可以使用枚举
创建多个Singletonpublic enum Callables implements Callable<String> {
HELLO {
public String call() { return "Hello"; }
},
WORLD {
public String call() { return "World"; }
}
}
注意:HELLO和WORLD共享一个超级Callables但实际上有不同的类。