天天看点

java中如何应对构造函数参数过多(构造者模式实际应用)

作者:散文随风想

在书写一个类的时,常常会出现一个类的属性有很多,那么就有可能存在这种情况,有一些属性是必须存在的,但是有一些属性是非必须的,根据实际业务来确定。这种情况该怎么处理类的构造函数呢?总不可能为每一种情况都来写一个构造函数吧?这样代码太冗余了,在new对象的时候也容易出错。

可以通过使用静态内部类来比较优雅的处理这个问题。

1.创建一个合适的类:Student

public class Student {
    private int age;//年龄
    private String name;//姓名
    private int id;//身份证
    private String address;//住址
    private String sex;//性别
    private String phnum;//电话号码
    public Student() { }
}           

其中年龄和姓名是必须的,其他属性是非必须的

2.Student有参的构造函数通过静态内部类Builder来处理

为了减少代码,这里将Student类属性的get和set方法省略了,只留了主体代码,如下:

public class Student {
    private int age;//年龄
    private String name;//姓名
    private int id;//身份证
    private String address;//住址
    private String sex;//性别
    private String phnum;//电话号码
    
    public Student() {
    }

    public Student(Bulider bulider){
        this.age = bulider.age;
        this.name = bulider.name;
        this.id = bulider.id;
        this.address = bulider.address;
        this.sex = bulider.sex;
        this.phnum = bulider.phnum;
    }

    //通过这个静态内部类来构造Student对象
    public static class Bulider{
        //学生类必须有的属性
        private int age;
        private String name;
        //学生类非必须有的属性
        private int id = 0;//身份证
        private String address = null;//住址
        private String sex = null;//性别
        private String phnum = null;//电话号码

        //通过Student类必须有的属性来写Builder的构造函数
        public Bulider(int age, String name) {
            this.age = age;
            this.name = name;
        }
        //通过方法来给Student类的属性赋值,注意,方法要返回Builder本身,方便链式调用
        public Bulider id(int val){
            this.id =val;
            return this;
        }
        public Bulider address(String val){
            this.address =val;
            return this;
        }
        public Bulider sex(String val){
            this.sex =val;
            return this;
        }
        public Bulider phnum(String val){
            this.phnum =val;
            return this;
        }
        public Student build(){
            return new Student(this);
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", id=" + id +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", phnum='" + phnum + '\'' +
                '}';
    }
}           

3. 测试

public class TestBulider {
    public static void main(String[] args) {
        Student student = new Student.Bulider(18,“张三”).address(“江西上饶”).id(123456).sex(“男”).build();
        System.out.println(student);
    }
}           
java中如何应对构造函数参数过多(构造者模式实际应用)