除了使用构造器来获取类的一个实例,还可以使用静态工厂方法(static factory method)。
下面的方法是将boolean基本类型转成一个Boolean对象引用:
1 public final class Boolean implements java.io.Serializable,
2 Comparable<Boolean>
3 {
4 //与基本类型boolean=true匹配
5 public static final Boolean TRUE = new Boolean(true);
6
7 //与基本类型boolean=false匹配
8 public static final Boolean FALSE = new Boolean(false);
9
10 //如果不是特别需要一个新的Boolean实例,这个方法应该优先于构造器
11 //因为这个方法有显著的时间和空间上的提高。
12 public static Boolean valueOf(boolean b) {
13 return (b ? TRUE : FALSE);
14 }
15 }
静态工厂的优势:
1、它们有名称。:当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重选择名称。
2、不必在每次调用它们的时候都创建一个新的对象。这使得不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,从而避免不必要的重复对象。以上代码说明了这点。
3、它们可以返回原返回类型的任何子类型的对象。jdk1.5中的类java.util.EnumSet没有共有构造器,只有静态工厂方法。
/*
创建一个空的enum set。根据枚举类型元素的个数返回不同类型的实例。
*/
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>() ;
}
静态工厂的劣势:
1、类如果不含公有的或者受保护的构造器,就不能被子类化。
2、它们与其他的静态方法实际上没有任何区别。
一些惯用的名称:valueOf、of、getInstance、newInstance、getType、newType。