遇到多个构造器参数时要考虑用构建器

来源:互联网 发布:php jsonp callback 编辑:程序博客网 时间:2024/06/06 00:01

静态工厂和构造器都有个共同的局限性:它们都不能很好地扩展到大量的可选参数。例如一个有很多属性的类,且很多属性不太经常用到或者值为零。可能我们会想到以下两种方法:

  1. 重叠构造器方法,第一个构造函数无参,第二个构造函数一个参数,依次类推。当赋值的时候如果要一一属性都赋值的话,会很麻烦,且当参数数目增加时,会更糟;
  2. javabeans模式,使用setter方法来设置每个必要的参数,这种方法创建实例容易,代码读起来也方便。并且我们需要考虑的是,该类可以看作是一个临界区,共享资源,因此我们需要考虑线程安全。
  3. 因此考虑使用builder模式。不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂)得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后客户端调用无参的build方法来生成不可变的对象。这个builder是它构建的类的静态成员类
  4. Java中传统的抽象工厂实现是Class对象,用newInstance方法充当build方法的一部分。这种方法隐含着许多问题,因为有可能类没有可以访问的无参构造器,编译时不会报错。反而客户端必须在运行时处理异常。也就是说Class.newInstance破坏了编译时的异常检查。
  5. 不足:要创建builder对象,必须先创建它的构建器。创建构建器的开销也是不可忽视的。Builder模式比重叠构造器模式更加冗长,因此只有参数很多,且大多数参数都是可选的时候。与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更易阅读和编写,构建器也比javaBeans更加安全。
阅读全文
0 0
原创粉丝点击