所以我一直在閱讀一些有效的Java!本書最鼓舞人心的部分之一是Bloch寫的關於「Builder」 - 類而不僅僅是POJO的不變對象/構建器部分。Java模型對象設計
注:我在這裏說的是模型對象:例如第或汽車。
這是我以前寫的這些對象:
public class Car {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
現在,當你看到這樣的設計在許多方面不足,它需要的可變性,你必須構造與第一構造函數的對象,然後設置名字。
現在當然你可以使name
字段最終並在構造函數中用作參數,但是如果你有一個大對象包裝例如一些SQL表,那麼你將會有一個醜陋的構造函數,像這樣:
public Car(int horsepowers, String name, String brand, int yearManufactured,
User owner, List<User> previousOwners) {
//Set the values
}
這在創建對象時變得不可讀,而這只是六個字段!
所以,布洛赫提出以下(含不變性)
public class Car {
public static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public Car build() {
reeturn new Car(this);
}
}
private final String name;
private Car(Builder builder) {
name = builder.name;
}
public String getName() {
return name;
}
}
//Construction example
Car car = new Car.Builder().setName("Speedy").build();
現在,這給了我們永恆!如果你有一些不是原始的或不可改變的物體,只需將它們複製到Builder
的setter中,然後再將它們複製到Car
的getters中。
但它很羅嗦,如果類足夠小,我一直在使用構造函數參數。 如果一個類需要一個可變字段,我只是讓該字段可變,如果該類有足夠的屬性(> 4東西)。
另一個問題是,當使用android並且該類具有例如Bitmap
時,則必須返回實際的位圖並且不復制它,因爲這相當性能 - 昂貴。
我看過很多像這樣的問題,但我似乎無法在這個問題上找到很好的答案:在這些設計上是否有任何標準,它們的設計如何?什麼是好處/壞處?
在此先感謝!
編輯:
的問題是:
什麼是構造應該是一成不變的,用一個對象模型)少數領域和B)大的最好方式字段數?如何處理上面提到的Bitmap
問題以及類似的問題?使某些領域可變?
對不起,模糊不清。
我想'點Builder'是當你正在處理不可變具有一些必需和可選字段的對象。因爲你會將字段聲明爲'final'。所以它不適用於每個設計。 – Sam 2013-05-09 09:11:17