所谓静态工厂方法,实际上只是一个简单的静态方法,它返回的是类的一个实例。特点就是构造方法是私有的。
静态工厂方法有四大优势:
优势1.静态工厂方法的名称,因此比构造器更准确地描述返回的实例。
public class RandomIntGenerator {
private final int min;
private final int max;
private RandomIntGenerator(int min, int max) {
this.min = min;
this.max = max;
}
public static RandomIntGenerator between(int max, int min) {
return new RandomIntGenerator(min, max);
}
public static RandomIntGenerator biggerThan(int min) {
return new RandomIntGenerator(min, Integer.MAX_VALUE);
}
public static RandomIntGenerator smallerThan(int max) {
return new RandomIntGenerator(Integer.MIN_VALUE, max);
}
public int next() {...}
}
优势2:不必再每次调用它们的时候都创建一个新对象。
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
优势3.静态工厂方法可以返回原返回类型的子类型对象。
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
优势4.静态工厂方法创建参数化(泛型)实例的时候更加简洁。
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
这样一来创建实例时就可以:
Map<String,List<Integer>> n = newInstance();
而不是
Map<String,List<Integer>> m = new HashMap<String,List<Integer>>();