網頁

2020/4/3

Java 什麼是immutable class

Immutable class(不可變類別)的實例建構後即無法修改,物件生命週期間的狀態固定。

Java典型的immutable class有String,原始型別的包裹類如IntegerLongDoubleBigIntegerBigDecimal等。

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());
    }

}


參考:

沒有留言:

張貼留言