不可變類的配方

不可變物件是無法更改其狀態的物件。不可變類是一個類,其例項在設計和實現方面是不可變的。最常見的不可變性示例 Java 類是 java.lang.String

以下是一個陳規定型的例子:

public final class Person {
    private final String name;
    private final String ssn;     // (SSN == social security number)

    public Person(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }

    public String getName() {
        return name;
    }
   
    public String getSSN() {
        return ssn;
    }
}

對此的一種變化是將建構函式宣告為 private 並提供 public static 工廠方法。

不可變類的標準配方如下:

  • 必須在建構函式或工廠方法中設定所有屬性。
  • 應該沒有制定者。
  • 如果出於介面相容性原因需要包含 setter,它們應該不執行任何操作或丟擲異常。
  • 所有屬性都應宣告為 privatefinal
  • 對於引用可變型別的所有屬性:
    • 應該使用通過建構函式傳遞的值的深層副本初始化該屬性,並且
    • 屬性的 getter 應該返回屬性值的深層副本。
  • 該類應宣告為 final,以防止有人建立不可變類的可變子類。

還有幾點需要注意:

  • 不可變性不會阻止物件可以為空; 例如,null 可以分配給 String 變數。
  • 如果將不可變類屬性宣告為 final,則例項本身就是執行緒安全的。這使得不可變類成為實現多執行緒應用程式的良好構建塊。