内部にListを格納するクラスを Java で実装しました。クラスを不変にしたい。ただし、クラスのコンテキストでは意味をなさない内部データに対して操作を実行する必要があります。したがって、一連のアルゴリズムを定義する別のクラスがあります。簡単な例を次に示します。
ラッパー.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(); }
}
アルゴリズム.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( )などのメソッドを介してデータを変更するのを止めるものは何もありません。ここで、イテレーターを介してのみデータへのアクセスを提供できることに気付きました。ただし、 Collectionを渡すのが一般的だと言われました。第 2 に、データに対して複数回のパスを必要とするアルゴリズムがある場合、複数の反復子を提供する必要があり、これは滑りやすい斜面のように思えます。
さて、私の懸念を解決する簡単な解決策があることを願っています。私は Java に戻ったばかりで、C++でconstを扱う前にこれらのことを考えたことはありませんでした。前もって感謝します!
おー!もう一つ、ふと思ったことがあります。内部Listのコピーを実際に返すことはできません。通常、リストには数十万の要素が含まれます。