2、面对多参数的构造方法时考虑使用构造器

不管是构造方法还是静态工厂方法,都存在一个问题,就是在创建对象时要传入n多参数,这次要说的是使用构造器。
举个例子说明这样做的好处,先看使用构造方法的情况:

public class Person {
    private String name; // 必须
    private boolean gender; // 必须
    
    private int age; // 可选
    private int height; // 可选
    private int weight; // 可选
    private String description; // 可选
    
    public Person(String name, boolean gender) {
        this(name, gender, 18);
    }
    public Person(String name, boolean gender, int age) {
        this(name, gender, age, 170);
    }
    public Person(String name, boolean gender, int age, int height) {
        this(name, gender, age, height, 50);
    }
    public Person(String name, boolean gender, int age, int height, int weight) {
        this(name, gender, age, height, weight, "");
    }
    public Person(String name, boolean gender, int age, int height, int weight, String description) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.height = height;
        this.weight = weight;
        this.description = description;
    }
}

调用的时候,我们可能会使用:

Person p = new Person("Sirius",false,25,165,50,"a cute girl");

如果我们只是想设置简介,也必须要把6个参数全都输入,很恶心的,这样既不便于书写,也不便于阅读。
好了,看看构造器的强大吧,把上面的代码写成构造器的方式:

public class Person {
    private String name; // 必须
    private boolean gender; // 必须
    
    private int age; // 可选
    private int height; // 可选
    private int weight; // 可选
    private String description; // 可选
    
    public static class Builder {
        // 必须
        private String name;
        private boolean gender;
        // 可选,设置默认值
        private int age = 18;
        private int height = 170;
        private int weight = 50;
        private String description = "";
        
        public Builder(String name, boolean gender) {
            this.name = name;
            this.gender = gender;
        }
        public Builder age(int val){
            age = val;
            return this;
        }
        public Builder height(int val){
            height = val;
            return this;
        }
        public Builder weight(int val){
            weight = val;
            return this;
        }
        public Builder description(String val){
            description = val;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
    
    private Person(Builder builder) {
        this.name = builder.name;
        this.gender = builder.gender;
        this.age = builder.age;
        this.height = builder.height;
        this.weight = builder.weight;
        this.description = builder.description;
    }
}

貌似比刚才复杂了一些,看看调用的时候吧

Person p = new Person.Builder("Sirius", false).age(25).height(165).description("a cute girl"),build();

好多了吧,清晰明了,用到哪个就写哪个,多方便啊。    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值