在Java中使用什么更好:单例或具有所有静态成员的类?或者没关系?
例如,我想从不同的类访问X
类,但X
类必须包含使用它的所有类的类似值。
答案 0 :(得分:2)
在某些情况下,静态类比Singleton更有意义。您可以看到java.lang.Math的示例。这不是单身人士 - 。它只是为我们提供了一堆静态方法。
如果你的类没有维护任何状态,只提供对某些方法的全局访问,那么你应该使用静态类,因为静态方法比Singleton更快,因为在编译期间静态绑定。请记住,不能将静态方法用于多态,因为无法覆盖静态方法。
如果你想维护对象的状态,你必须使用单例而不是静态方法。当你需要一个具有完全OO功能的类时,选择Singleton,而如果你只需要存储一堆静态方法在一起,而不是使用静态类。
您可以在此处获得详细说明 阅读更多:http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html#ixzz2iNE3rW4i
答案 1 :(得分:1)
对我来说:Singleton is an anti-pattern并且只应该在有充分理由的情况下使用,在我看来,只有一个类只有公共静态变量是不可接受的,这个声音不是真正面向我的对象。您可以使用Dependency Injection,其好处是可测试性,您可以避免在创建单例时进行双重检查(如果您不使用enum)。
这看起来像:
public class SharedObject{
// content
}
public class Worker{
private final SharedObject sharedObject;
public Worker(SharedObject sharedObject){
this.sharedObject = sharedObject;
}
}
通过这种方式,您还可以看到对象的来源,您可以使用Mocktio轻松模拟共享对象。它迫使您构建代码以便于测试,同时它将采用更模块化的方向。
答案 2 :(得分:1)
对于无状态的类,我更喜欢静态方法,就像Math
或System
类,而单例,反之亦然 - >对于有状态的类,例如FacesContext
。
答案 3 :(得分:0)
全静态类通常用于共享实用程序方法,这些方法在逻辑上组合在一起但不共享它们之间的状态(字段)。
如果出现以下情况,单身人士会更好:
ActionListener
)(另一种说法:如果你需要多态性,你的单身必须是一个对象,而不是一个类)
答案 4 :(得分:0)
使用静态方法最好是 not-heritable 和不可实例化的类。 e.g:
public final class Constants {
private Constants() {
// non-public constructor
}
public static final Pattern ID_PATTERN = Pattern.compile("^\\d{4,10}$");
public static final Locale DEFAULT_LOCALE = new Locale("en", "US");
...
}
仅当您要维护某些状态时才使用单例,类似于应用程序范围。但是,如果您想要清洁设计,则必须是两个类。