EffectiveJava78条学习笔记之2

1、静态工厂和构造器共同缺点:

  • 不能很好的扩展到大量可选参数

2、重叠构造器模式可以部分解决上述问题,但遇到参数 太多 会使得客户端代码难以编写、阅读

  • 一长串类型相同的参数,会导致微妙的错误
  • 如有两个点到顺序,编译器不报错,运行时报错,调试难度增加

3、简化构造函数,采用setter方法:

  • 这种模式 JavaBean 构造过程状态不一致,调试更加困难
  • 阻止了类做成 不可变类的可能<15条>
  • 保证线程安全较难

4、Builder(构建器)模式:

  • 保证状态一致
  • 可读性好

客户端利用所有参数调用构建器,类似setter方法设置相关参数:

  • 客户端可以调用无参构造方法,生成不可变对象
  • Builder 是构建类的静态成员类<22条>

构建该类:

  • 注意这里 new NutritionFacts.Builder(240,8) 实例化的是内部静态类Builder
  • NutritionFacts类在最后的build()方法内实例化的
  • 所以 NutritionFacts 类是不可变类没问题

实例化外层类时,将builder的这些参数拷贝过去:

  • 此时依然可以在构建类中,检验参数的合法性
  • 不合法,抛出 IllegalStateException 异常
  • 也可以在 setter 方法中检验,这样不用等到实例化才报错

5、Builder模式灵活性

  • 可以用来创建多个对象
  • builder 的参数可以在创建时调整,随对象改变
  • 也可以自动填充某些域

6、设置了参数的 Builder 是一个很好的 抽象工厂

  • 举例如下(有限制的通配符)构建Tree:

Class.newInstance() 破坏了编译时的异常检查

  • Builder弥补了该不足
  • newInstance总是企图调用类的无参构造器

7、Builder模式不足:

  • 创建对象前,先创建构建器,性能有些许损耗
  • Builder模式比重叠构造器更冗长,故很多很多参数时才使用

END:

  • 如果类包含多个参数,构建器Builder是不错的选择
  • 特别是大多数参数是可选的时候
  • 构建器比重叠构造器 易于阅读
  • 构建器比JavaBeans更加安全

猜你喜欢

转载自my.oschina.net/u/3847203/blog/1816904