【effective java】遇到多个构造器参数时要考虑用构建起

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

最近看《effective java》。看到第二条关于创建实例的一条的一条建议。

书中实例化对象的三种方式

  • 重叠构造器的方式创建对象
  • java beans模式的模式创建对象
  • 构建器模式(推荐)

重叠构造器模式

我们初学的时候都会选择 重画构造器模式,在这种情况下,第一个构造器是实例化对象必须的参数,第二个会多一个参数,就这样叠加,最后是一个有所有参数的构造器。

java beans模式

这种模式,也是我们常用的一种模式,说白了就是通过setter/getter给属性赋值/获取属性值。通过javabeans的代码如下:

public class Person{
    private String name;
    private int age;
    private String address;
    public String phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

实例化的代码如下

Person p = new Person():
p.setName("tom"):
p.setAge(18);
p.setAddress(“深圳”);
p.setPhone("110);

优点
1.创建实例容易
2.代码容易阅读

缺点
1.构造的过程分到了几个调用中,在构造JavaBeans的时候可能会不一致
2.类无法仅仅通过检验构造器参数的有效性来保证一致性!
3.对象的不一致会导致失败,JavaBeans模式阻止了把类做为不可变的可能,需要程序员做额外努力来保证它线程安全

Builder模式

构建器的写法比较固定,网上的代码也比较多,可以便用lombok 的中的注解,@Data,@Bullder
,@NoArgsConstructor,@AIlArgsConstructor
例如

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person{
    private String name;
    private int age;
    private String address;
    public String phone;
}

实例化的代码如下:有多少个属性,就可以一直在后面通过.的方式对属性进行赋值了。

 Person person = Person.builder().name("张三”).age(18).build();

优点
1.构建器的创建对象就比较易于创建与阅读,线程安全
2.等待所有的参数验证通过才会build()对象。
3.与构造器相比,builder的微略优势在,builder可以有多个可变(varargs)参数。
4.builder模式非常灵活,可以由单个builder构建多个对象,builder的参数可以在创建对象时进行调整
5.设置了参数的builder生成一个很好的抽象工厂(Abstract Factory),也就是客户端可以将这样一个builder传给方法,使该方法能为客户娴食
6.builder也有自己的不足,就是创建对象就必须创建它的构建器,虽然创重构建的开销在实践中可能不是很明显.
7.builder模式还比重叠委构造器模式更加的冗长,因此它会在参数多的时候使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值