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

12次阅读

共计 1636 个字符,预计需要花费 5 分钟才能阅读完成。

先看代码,这是 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 一一类型转换方法,它只有单个参数,返回该类型的一个相对应的实例,例如:
Dated= Date om(i 1stant) ; 
  • of 聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来,例如
Set<Rank> faceCa ds = EnumSet. of (JACK , QUEEN, KING];
  • valueOf 一一比 from of 更烦琐的 种替代方法,例如
Bigintege me = Bigintege .valueOf(Intege .MAX_VALUE);
  • instance 或者 get Instance -返回的实例是通过方法的(如有)参数来描述的,但是不能说与参数具有 同样的值,例如
StackWalke luke = StackWalke .getinstance(options);
  • create 或者 new nstance 一一才象 instance 或者 getinstaηce 样,但 create 或者 new st ance 能够确保每次调用都返回一 新的实例,例如:
Object newA「「ay =「「ay.ne instance(classObject,「「aylen 〕;
  • get Type- get Ins taηce 样,但是在工厂方法处于不同的类中的时-候使 Typ 表示工厂方法所返回的对象类型,例如:
FileSto fs = Files.getFileStore(path];
  • newType 一寸’象 ewinst an ce 样,但是在工厂方法处于不同的类中的时候使用 Type 表示工厂方法所返回的对象类型,例如:
Buffe edReade「= Files.newBuffe edReade path);
  • type- 一-get ype new Type 的简版,例如:
List<Complaint> litany ζollections.list(legacylitany〕;

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

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

正文完
 0