Effective Java第三版读书笔记

对象的生成与销毁

使用静态工厂方法代替构造器

  • 工厂方法可以提供更好的命名, 如BigInteger.probablePrime()与BigInteger(int, int, Random). 倘若有两个构造器仅仅方法参数顺序不同, 其他人在使用时会懵逼. 这可以用被友好命名的工厂方法来替代.
  • 工厂方法可以控制使用者何时去创建新对象. 如不可变类可以共享实例, 单例模式等, 从而提高性能.
  • 工厂方法可以返回其返回类型的子类的实例. 如Collections, Executors等. (java 8起可以在接口里提供静态方法. java 9起可以在接口里提供私有静态方法)
  • 基于上一条, 返回的实例可以是动态生成的或者随版本发布而升级实现的. 如EnumSet的RegularEnumSet与JumboEnumSet.
  • 工厂方法返回的实例可以不存在实现的代码(起码在写这个工厂的时候, 实现可以让其他方搞). 如JDBC实现了JVM提供的接口.
  • 仅提供静态工厂方法而没有public货protected的构造器的限制是不能拥有子类.
  • 另一个缺点是: 静态工厂方法对于程序员不容易发现.

一些方法命名规则:

  • from: 类型转换, 接收单个参数.
  • of: 接收多个参数, 聚合为一个结果.
  • valueOf: 可用来代替from与of.
  • instance,getInstance: 返回单例结果.
  • create,newInstance: 每次调用返回新实例.
  • getType: 类似getInstance但是, 返回的是不同类型(type). 如FileStore fs = Files.getFileStore(path);
  • newType: 类似newInstance, 返回不同类型.
  • type: 前两者的简洁方式.