Effective Java - 用静态工厂方法代替构造器

先看代码,这是boolean包装类Boolean,其内部就有静态工厂方法。

public final class Boolean {

    public static final java.lang.Boolean TRUE = new java.lang.Boolean(true);

    public static final java.lang.Boolean FALSE = new java.lang.Boolean(false);

    public static java.lang.Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
}

静态工厂方法优点

  • 工厂方法有方法名,通常我们都是通过重载构造器的方式构造不同的对象,有时我们可能传入同样的参数,但其他参数的默认值不同,这时构造器就不能满足我们要求。而且参数过多容易导致错误,也不容易理解,静态方法名能描述要被返回对象,更易于使用。

  • 不必每次都创建一个新对象,静态工厂方法能够为重复的调用返回相同对象,如Boolean,其内部有两个预先定义好的常量(TRUE,FALSE),当我们调用Boolean.va lueOf (b oolean )时会得到其中一个,不会每次都创建一个新对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在,也会提高性能。

  • 它们可以返回原返类型的任何子类型的对象,这样在选择返回对象的类型时就灵活很多,如:java.util.Collections。

  • 所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。

  • 方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在 这

静态工厂方法的缺点

  • 类如果不含公有的或者受保护的构造器,就不能被子类化。 这也不全是缺点,因为我们在写代码是要多用组合,少用继承。

  • 静态工厂方法不容易被发现, 当我们要创建一个类的对象时,要有意识地在该类搜索静态工厂方法。

静态工厂方法的常用名称

  • from一一类型转换方法,它只有单个参数,返回该类型的一个相对应的实例,例如:
Date d = Date.from(instant) ; 
  • of一一聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来,例如
Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
  • valueOf一一比 from和of 更烦琐的一种替代方法,例如
Bigintege prime = Bigintege.valueOf(Intege.MAX_VALUE);
  • instance 或者 getInstance一一返回的实例是通过方法的(如有)参数来描述的,但是不能说与参数具有 同样的值,例如
StackWalke luke = StackWalke.getinstance(options);
  • create 或者 newInstance一一像 instance 或者 getinstaηce 一样,但 create或者 newInstance 能够确保每次调用都返回一个新的实例 ,例如:
Object newArray = Array.newinstance(classObject, arraylen 〕;
  • getType一像getInstaηce 一一样,但是在工厂方法处于不同的类中的时候使用。Type 表示工厂方法所返回的对象类型,例如:
FileSto fs = Files.getFileStore(path];
  • newType一像newinstance一一样,但是在工厂方法处于不同的类中的时候使用。 Type 表示工厂方法所返回的对象类型,例如:
BufferedReade br= Files.newBuffeedReade(path);
  • type一一getype和newType 的简版,例如:
List<Complaint> litany Collections.list(legacylitany〕;

简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处静态工厂经常更合适,因切忌第一反应就是提供公有的构造器, 而不先考虑静态工厂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章