遇到多个构造器参数时要考虑用构建起
最近看《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模式还比重叠委构造器模式更加的冗长,因此它会在参数多的时候使用。