在 Java 中使用什么更好:单例还是具有所有静态成员的类?还是没关系?
例如,我想X
从不同的类访问一个类,但X
该类必须包含所有使用它的类的相似值。
在某些情况下,静态类比 Singleton 更有意义。您可以查看 java.lang.Math 的示例。这不是单例-。它只是为我们提供了一堆静态方法。
如果您的类没有维护任何状态,而只是提供对某些方法的全局访问,那么您应该使用静态类,因为静态方法比单例更快,因为在编译时是静态绑定。请记住,您不能将多态性与静态方法一起使用,因为不能覆盖静态方法。
如果你想保持对象的状态,你必须使用单例而不是静态方法。当你需要一个具有完全 OO 能力的类时,选择单例,而如果你只是需要将一堆静态方法存储在一起,而不是使用静态类。
你可以在这里有详细的描述阅读更多:http: //javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html#ixzz2iNE3rW4i
对我来说:Singleton 是一种反模式,只有在有充分理由的情况下才应该使用,而且我认为仅保留公共静态变量的类是不可接受的,这听起来对我来说不是真正的面向对象。您可以使用Dependency Injection,好处是可测试性,并且您可以避免在创建单例时进行双重检查(如果您不使用enum)。
这看起来像:
public class SharedObject{
// content
}
public class Worker{
private final SharedObject sharedObject;
public Worker(SharedObject sharedObject){
this.sharedObject = sharedObject;
}
}
通过这种方式,您还可以看到对象来自何处,您可以使用Mocktio轻松模拟共享对象。它迫使您构建代码以便于测试,同时它将朝着更加模块化的方向发展。
我更喜欢无状态类的静态方法,就像Math
orSystem
类,反之亦然 -> 对于有状态的类,比如FacesContext
.
全静态类通常用于在逻辑上组合在一起但在它们之间不共享状态(字段)的共享实用程序方法。
如果满足以下条件,单身人士会更好:
ActionListener
)(另一种说法:如果你需要多态,你的单例必须是一个对象而不是一个类)
最好是具有静态方法的不可继承和不可实例化的类。例如:
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");
...
}
仅当您想维护某些状态时才使用单例,类似于应用程序范围。但是,如果你想要一个干净的设计,必须是两个类。