クライアントが元の可変リストへの参照をまだ持っている場合は、を直接使用するだけでCollections.unmodifiableList
は不十分です。
元の可変リスト(デリゲート)への内部参照を持つ委任リストの実装を作成し、すべてのメソッド呼び出しをそれに転送します。このようなコードを手作業で作成するのはPITAですが、たとえばEclipseは自動的にコードを生成できます。
次に、freeze
メソッドを呼び出すときに、元のリストをでラップします。Collections.unmodifiableList
これにより、今後のすべてのメソッド呼び出しがFreezingList
、変更不可能なビューを介してのみ元のデリゲートに移動するようになります。
より安全で柔軟性を低くするために、次のコンストラクターを変更して、元のリストをリストに渡す代わりに(元の可変リストへの参照をクライアントに残すことができます)、リストを内部でインスタンス化します(たとえば、ArrayList
)。
public class FreezingList<E> implements List<E> {
// the original list you delegate to (the delegate)
private List<E> list;
private boolean frozen = false;
public FreezingList(List<E> list) {
this.list = list;
}
public void freeze() {
if (!frozen) {
list = Collections.unmodifiableList(list);
frozen = true;
}
}
// all the delegating methods follow:
public int size() {
return list.size();
}
public E get(int index) {
return list.get(index);
}
// etc. etc.
}