标签:java 使用 cti 代码 new ad on ef c
对于一个参数有多个的构造器的类,程序员一向习惯采用重叠的构造器模式。
public class Person {
private String Id;
private String name;
private String address;
public Person(String id) {
Id = id;
}
public Person(String name, String address) {
super();
this.name = name;
this.address = address;
}
public Person(String id, String name, String address) {
Id = id;
this.name = name;
this.address = address;
}
}
重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写。并且难以阅读。遇到许多构造器参数的时候,还有第二种代替办法,即JavaBean模式(现在这种模式可以说是非常流行了)。在这种模式下,调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数。以及每个相关的可选参数:
public class Person {
private String Id;
private String name;
private String address;
public Person() {
super();
}
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
幸运的是,还有第三种替代方法,既能保证像重叠构造器模式那样的安全性,也能保证像JavaBeans模式那么好的可读性。这就是Builder模式。不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器,得到一个builder对象。然后客户端在builder对象上嗲用类似于setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的builder方法来生成不可变的对象。这个builder是它构建器的类的静态成员类。
public class Person {
private String Id;
private String name;
private String address;
public static class Builder{
//所必须的参数
private final String Id;
//可选的参数
private String name = "";
private String address = "" ;
public Builder(String id){
this.Id = id;
}
public Builder name(String name){
this.name = name;
return this;
}
public Builder address(String address){
this.address = address;
return this;
}
public Person build(){
return new Person(this);
}
}
private Person (Builder builder){
this.Id = builder.Id;
this.name = builder.name;
this.address = builder.address;
}
}
Person person = new Person.Builder("100").address("ss").name("ss").build();
effective java读书札记值第2条:遇到多个构造器参数时要考虑用构造器
标签:java 使用 cti 代码 new ad on ef c
原文地址:http://blog.csdn.net/howlaa/article/details/38798579