QQ :375061590
当一个类有多个属性的时候,这时候要去实例化这个类,太多的属性会带来一些不便。
把广东工业大学图书馆的书看成一个实体:
package DesignPattern;
public class Book {
/**
* 书名
*/
private String bookName;
/**
* 可借数量
*/
private String leandableNum;
/**
* 索引号
*/
private String reference;
/**
* 作者
*/
private String writer;
/**
* 出版社
*/
private String publisher;
/**
* 出版年
*/
private String pubYear;
public Book(String bookName, String leandableNum, String reference,
String writer, String publisher, String pubYear) {
this.bookName=bookName;
this.leandableNum=leandableNum;
this.reference=reference;
this.writer=leandableNum;
this.publisher=publisher;
this.pubYear=pubYear;
}
}
实例化Book
Book book = new Book(“深入分析Java Web技术内幕 [专著]”, “0”, “TP312JA/X781”, “许令波”, “电子工业出版社”, “2012”);
过多的参数会使使用者混淆,不小心少了一个参数,或者颠倒了位置,会使实例化出错,或者实例出现数据错误,而这种错误编译器是不会报错的。
重叠构造器:
重叠构造器解决了一般构造器多参数时候参数混乱的缺点
public Book(String bookName) {
this( bookName,"");
}
public Book(String bookName, String leandableNum) {
this( bookName,leandableNum,"");
}
public Book(String bookName, String leandableNum, String reference) {
this( bookName,leandableNum,reference,"");
}
public Book(String bookName, String leandableNum, String reference,
String writer) {
this( bookName,leandableNum,reference,writer,"");
}
public Book(String bookName, String leandableNum, String reference,
String writer, String publisher) {
this( bookName,leandableNum,reference,writer,publisher,"");
}
public Book(String bookName, String leandableNum, String reference,
String writer, String publisher, String pubYear) {
this.bookName=bookName;
this.leandableNum=leandableNum;
this.reference=reference;
this.writer=leandableNum;
this.publisher=publisher;
this.pubYear=pubYear;
}
这类构造通过构造器调用构造器,最后会调用到最后一个构造器,包含了所有参数,但是该方法在更多属性的时候,参数变得太多的话,会产生一大堆构造器,且难控制,代码就太冗长了。
JavaBeans的setter方法
该方法取代重叠构造器一大堆的构造方法,简化成只需要一个不带参数的构造方法:
public Book() { }
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setLeandableNum(String leandableNum) {
this.leandableNum = leandableNum;
}
public void setReference(String reference) {
this.reference = reference;
}
public void setWriter(String writer) {
this.writer = writer;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public void setPubYear(String pubYear) {
this.pubYear = pubYear;
}
public void setBook(Book book) {
this.book = book;
}
Book book = new Book();
book. setBookName(“深入分析Java Web技术内幕 [专著]”);
book .setLeandableNum(“0”);
book .setReference(“TP312JA/X781”);
book . setWriter (“许令波”);
book . setPublisher (“电子工业出版社”);
book . setPubYear (“2012”);
setter方法名称简单易懂,使得代码更加清晰,不会很容易混淆参数。
但是如果该类是一个不可变类(像String类),setter方法就会破坏其不可变性,使得类是线程不安全的,这时候就要花心思对线程安全进行处理。
Builder模式
可以解决这个问题,既有很强可读性,又能保证不可变类的线程安全。
package DesignPattern;
public class Book {
/**
* 书名
*/
private String bookName;
/**
* 可借数量
*/
private String leandableNum;
/**
* 索引号
*/
private String reference;
/**
* 作者
*/
private String writer;
/**
* 出版社
*/
private String publisher;
/**
* 出版年
*/
private String pubYear;
public Book(Builder builder) {
this.bookName = builder.bookName;
this.leandableNum = builder.leandableNum;
this.reference = builder.reference;
this.writer = builder.writer;
this.publisher = builder.publisher;
this.pubYear = builder.pubYear;
}
public static class Builder {
/**
* 书名
*/
protected String bookName;
/**
* 可借数量
*/
protected String leandableNum;
/**
* 索引号
*/
protected String reference;
/**
* 作者
*/
protected String writer;
/**
* 出版社
*/
protected String publisher;
/**
* 出版年
*/
private String pubYear;
public Book build() {
return new Book(this);
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setLeandableNum(String leandableNum) {
this.leandableNum = leandableNum;
}
public void setReference(String reference) {
this.reference = reference;
}
public void setWriter(String writer) {
this.writer = writer;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public void setPubYear(String pubYear) {
this.pubYear = pubYear;
}
}
}
Book.Builder builder = new Builder();
builder. setBookName(“深入分析Java Web技术内幕 [专著]”);
builder.setLeandableNum(“0”);
builder.setReference(“TP312JA/X781”);
builder. setWriter (“许令波”);
builder. setPublisher (“电子工业出版社”);
builder. setPubYear (“2012”);
Book book = builder.build();