首页 > 代码库 > 第二章、创建和销毁对象。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:考虑用静态工厂方法代替构造器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。