Effective Java 2 -- 遇到多个构造器参数的时候考虑构建器

来源:互联网 发布:生成式对抗网络 应用 编辑:程序博客网 时间:2024/06/05 11:01

    当有构造器的多个参数而且有必选参数和可选参数的时候,我们通常会使用什么样的方法来创建对象?

    也许是我们可以用重载构造器来进行创建,但是那样需要写的构造方法太多,而且创建对象的时候我们也许会忘记我们构造器方法的参数顺序。

    也许我们会使用JavaBean的规范,设置空构造器,然后使用set方法来一一赋值,这样使得参数在赋值过程中可读性更好,然而JavaBean模式阻止了把类做成不可变的可能,这不是线程安全的

    下面要介绍的就是更加安全,而且可读性更好的方法----构建器:

package 构建器;public class MyBuilder {    //以下两个元素是必须的    private int i1;    private int i2;        //以下两个元素是可选的    private int i3;    private int i4;        public static class Builder{        //必须参数        private final int i1;        private final int i2;                //可选参数        private int i3 = 0;        private int i4 = 0;//默认参数        public Builder(int i1,int i2){            this.i1 = i1;            this.i2 = i2;        }        public Builder i3( int i3 ){            this.i3 = i3;            return this;        }        public Builder i4( int i4 ){            this.i4 = i4;            return this;        }        public MyBuilder build(){            return new MyBuilder(this);        }    }    public MyBuilder( Builder builder){        this.i1 = builder.i1;        this.i2 = builder.i2;        this.i3 = builder.i3;        this.i4 = builder.i4;    }    public static void main(String[] args) {        MyBuilder myBuilder = new MyBuilder.Builder(1, 2).build();//创建一个(i1,i2,i3,i4)参数分别为(1,2,0,0)的对象        MyBuilder myBuilder2 = new MyBuilder.Builder(1, 2).i3(3).i4(4).build();//创建一个(i1,i2,i3,i4)参数分别为(1,2,3,4)的对象    }}

这样的构建方法显然比重载构造器要可读性强,也不是像JavaBean模式那样可变的。但是这样写会有一定的开销,而且比较冗长。总之,当构造器的参数过多的时候就可以考虑使用这种方法。

阅读全文
1 0