使用防禦性複製建立型別的不可變版本

Java 中的一些基本型別和類從根本上是可變的。例如,所有陣列型別都是可變的,像 java.util.Data 這樣的類也是如此。在強制要求不可變型別的情況下,這可能很尷尬。

解決這個問題的一種方法是為可變型別建立一個不可變的包裝器。這是一個整數陣列的簡單包裝器

public class ImmutableIntArray {
    private final int[] array;
    
    public ImmutableIntArray(int[] array) {
        this.array = array.clone();
    }

    public int[] getValue() {
        return this.clone();
    }
}

這個類通過使用防禦性複製來將可變狀態(int[])與可能使其變異的任何程式碼隔離開來:

  • 建構函式使用 clone() 建立引數陣列的不同副本。如果建構函式的呼叫者隨後更改了引數陣列,則不會影響 ImmutableIntArray 的狀態。

  • getValue() 方法還使用 clone() 來建立返回的陣列。如果呼叫者要更改結果陣列,則不會影響 ImmutableIntArray 的狀態。

我們還可以向 ImmutableIntArray 新增方法,以對包裝陣列執行只讀操作; 例如,獲取其長度,獲取特定索引處的值,等等。

請注意,以這種方式實現的不可變包裝型別與原始型別不相容。你不能簡單地用前者代替後者。