标签:style blog color java 使用 io strong ar div
除了使用构造器来获取类的一个实例,还可以使用静态工厂方法(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:考虑用静态工厂方法代替构造器
标签:style blog color java 使用 io strong ar div
原文地址:http://www.cnblogs.com/twoslow/p/3933905.html