私は内部的にリストを格納するJavaでクラスを実装しました。私はクラスを不変にしたい。しかし、クラスの文脈で意味をなさない内部データに対する操作を実行する必要があります。したがって、私はアルゴリズムのセットを定義する別のクラスを持っています。ここでは単純化した例です。今、私の質問は、変更されるのを防ぐための信頼できる方法がありますされJavaの不変オブジェクトとデータへのアクセス
Wrapper.java
import java.util.List;
import java.util.Iterator;
public class Wrapper implements Iterable<Double>
{
private final List<Double> list;
public Wrapper(List<Double> list)
{
this.list = list;
}
public Iterator<Double> iterator()
{
return getList().iterator();
}
public List<Double> data() { return getList(); }
}
Algorithm.java
import java.util.Iterator;
import java.util.Collection;
public class Algorithm
{
public static double sum(Collection<Double> collection)
{
double sum = 0.0;
Iterator<Double> iterator = collection.iterator();
// Throws NoSuchElementException if the Collection contains no elements
do
{
sum += iterator.next();
}
while(iterator.hasNext());
return sum;
}
}
私のクラスは不変であるという事実にもかかわらず、私の内部データですか?読み取り専用のためにdata()メソッドを提供していますが、などのメソッドを使用してデータを変更しないようにする方法はありません。clear()およびremove()今、私はイテレータを介して自分のデータへのアクセスを排他的に提供できることを認識しています。しかし、私はコレクションを渡すのが典型的であると言われています。第二に、データを複数回通過させるアルゴリズムがあれば、滑らかな斜面のように見える複数のイテレータを用意しなければならなくなります。
さて、うまくいけば私の懸念を解決する簡単な解決策があります。私はちょうどJavaに戻っており、のconstをC++で扱う前に、これらのことを考えたことはありません。前もって感謝します!
ああ!私が考えたことがもう一つはあります。私は実際に内部リストのコピーを返すことはできません。 リストには、通常数十万の要素が含まれます。
完璧!私はこれを見ませんでした。ありがとうございました。 –
Wrapperオブジェクトの作成方法については、依然として注意が必要です.Listはコンストラクタに渡されるため、コード内の他の場所への参照がある可能性があります。 Wrapperを本当に不変にしたい場合は、リストの内容をコピーする必要があります。 –