Immutable class(不可變類別)的實例建構後即無法修改,物件生命週期間的狀態固定。
Java典型的immutable class有String
,原始型別的包裹類如Integer
、Long
、Double
,BigInteger
及BigDecimal
等。
Immutable class的狀態固定且不可修改的特性在多併行程式(concurrent application)特別有用,因為可避免執行緒干涉(thread interference)造成狀態不一致的問題,所以immutable class是執行緒安全的(thread-safe)。
定義immutable class的方法如下
- 不提供修改屬性內容的setter方法。
- 所有的屬性宣告為
private final
使其無法被修改。 - 類別宣告為
final class
使無法被繼承,方法無法被覆寫。或是把建構式設為private
,並改以工廠方法提供物件的實例。 - 若屬性為mutable object應避免提供修改方法,讀取時提供複製物件而非原物件的參照。
Immutable class範例如下。
public final class Invoice {
private final String invoiceNo;
private final Integer total;
private final List<Item> itemList;
public Invoice(String invoiceNo, Integer total, List- itemList) {
this.invoiceNo = invoiceNo;
this.total = total;
this.itemList = itemList;
}
public String getInvoiceNo() {
return this.invoiceNo;
}
public Integer getTotal() {
return this.total;
}
public List<Item> getItemList() {
return this.itemList.stream()
.map(Item::clone) // deep copy list elements
.collect(Collectors.toList());
}
}
參考:
沒有留言:
張貼留言