码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-25 01:04:23      阅读:242      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!