首页 > 代码库 > 第二章、创建和销毁对象。ITEM1:考虑用静态工厂方法代替构造器

第二章、创建和销毁对象。ITEM1:考虑用静态工厂方法代替构造器

除了使用构造器来获取类的一个实例,还可以使用静态工厂方法(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。

 

第二章、创建和销毁对象。ITEM1:考虑用静态工厂方法代替构造器