不可變類的配方
不可變物件是無法更改其狀態的物件。不可變類是一個類,其例項在設計和實現方面是不可變的。最常見的不可變性示例 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,它們應該不執行任何操作或丟擲異常。
- 所有屬性都應宣告為
private
和final
。 - 對於引用可變型別的所有屬性:
- 應該使用通過建構函式傳遞的值的深層副本初始化該屬性,並且
- 屬性的 getter 應該返回屬性值的深層副本。
- 該類應宣告為
final
,以防止有人建立不可變類的可變子類。
還有幾點需要注意:
- 不可變性不會阻止物件可以為空; 例如,
null
可以分配給String
變數。 - 如果將不可變類屬性宣告為
final
,則例項本身就是執行緒安全的。這使得不可變類成為實現多執行緒應用程式的良好構建塊。