一天一条effective Java:遇到多个构造器参数时考虑用构建器

亡羊补牢,未为迟也。

  • 当我们遇到参数较多的构造器时,可考虑Builder模式。将众多参数分为必要参数和可选参数,如此既解决了构建对象时必须填写可选参数的问题,同时使得程序更具可读性。
    当然,你说可以重载构造器,提供多种构造方法,但当其他人想创建对象时,可能会一脸懵,我应该用哪个?
    我们用的更多的是JavaBean模式,调用无参构造器创建对象,然后setter属性值,这种方式构建简单且易读,但将对象的构建拆分成为不同的过程中,可能会导致线程安全性问题。
    因此有了该条建议:使用Builder模式。 下边是Builder模式构建对象的一个例子:
public class NutritionFacts {
    // 用final修饰,保证只在初始化时赋值
    private final int size;
    private final int fat;
    private final int sodium;
    private final int calories;
    // 用private修饰构造器,只允许外部使用Builder来创建对象
    private NutritionFacts(Builder builder) {
        this.size = builder.size;
        this.fat = builder.fat;
        this.sodium = builder.sodium;
        this.calories = builder.calories;
    }
    
    public static class Builder {
        // Required parameters
        private final int size;
        private final int fat;
        // Optional parameters - initialized to default values
        private int sodium = 0;
        private int calories = 0;
 		// 可选参数,返回Builder本身,从而将调用链接起来。
        public Builder setSodium(int sodium) {
            this.sodium = sodium;
            return this;
        }
 
        public Builder setCalories(int calories) {
            this.calories = calories;
            return this;
        }
 		// 必要参数
        public Builder(int size, int fat) {
            this.size = size;
            this.fat = fat;
        }
        
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }
}

客户端构建调用:

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).setSodium(20).builder();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值