Java で反復可能な不変クラスを実装したいと考えています。私は次のようにします:
public final class MyIterable implements Iterable<Integer> {
private final Collection<Integer> items;
public MyIterable(Collection<Integer> items) {
this.items = Collections.unmodifiableCollection(new LinkedList<Integer>(items));
}
@Override
public Iterator<Integer> iterator() {
return items.iterator();
}
}
これで問題ありません。私のインスタンスでは何も変更できません。ただし、私のクラスは、イテレータの remove() メソッドを使用して内部を変更できることを示す API をまだ公開しています。
MyIterable myIterable = new MyIterable(Arrays.asList(1, 2, 3));
for (Iterator<Integer> it = myIterable.iterator(); it.hasNext();) {
it.remove(); // I do not want to expose this even
// though I know it will throw an error at runtime.
it.next();
}
この削除メソッドの公開を回避して、クラスで真に不変の API を公開する方法はありますか? 代わりに次のようなものを実装するのが理想的ですがReadOnlyIterable
、そのようなものは Java では利用できないようです。