有效的java说 “考虑提供静态工厂方法而不是构造函数”
如果你有
class A {
public static A getInstance() {
return new A();
}
}
为A类提供此方法是否有意义,而不是在代码中调用new A()。
答案 0 :(得分:22)
请参阅here,了解您可能想要执行此操作的主要原因。总结:
另一个原因是文章没有提到:可以实现有趣的逻辑,以避免一直创建新对象(基于参数,回收等的缓存)。
答案 1 :(得分:18)
对于上面的示例,提供静态构造函数没有多大意义。通常,当您提供静态构造函数时,您应该将普通构造函数设为私有。否则,仍然可以使用普通构造函数创建实例。
我试着用另一个例子解释一下,当你可以使用静态工厂方法时。其中一个优点是,您可以为工厂方法提供可理解的名称。
class Complex {
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
private Complex(double a, double b) {
//...
}
}
Complex c = Complex.fromPolar(1, pi)
或者另一个例子是 Singleton Pattern 。在那里你不能只提供一个实例。所以这就是你将构造函数设为私有并创建一个自己的getInstance方法的原因,你可以确保只有一个实例可用。
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {
}
// synchronized keyword has been removed from here
public static Singleton getSingleton() {
if(singleton==null) {
synchronized(Singleton.class){
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
答案 2 :(得分:2)
如果你在寻找单个实例,那么使用静态方法调用的Singleton模式是一个更好的设计..因为静态的可重入锁定性质...提供线程安全性并且还避免无序写入..