Listインタフェースの実装はめんどかったので辞めます。Eclipseの"Generate Delegate Method"コマンドを使う手もありますが、その後の修正を考えるとやっぱりめんどい。
で、代わりにAbstractListを使ってみます。こいつは、オレみたいなめんどくさがり屋のために20のメソッドを実装してくれてます。残るはget(), size(), set(), add(), remove()の5つだけ。これを実装すれば望みのクラスが完成ですヽ(‘ ∇‘ )ノ。
import java.util.List; import java.util.ArrayList; import java.util.AbstractList; class PerlLikeList<E> extends AbstractList<E> { private List<E> innerList = null; public PerlLikeList() { this(new ArrayList<E>()); } public PerlLikeList(List<E> l){ this.innerList = l; } public int size() { return innerList.size(); } public E get(int index) { // 添字の正規化 if(index < 0) index += this.size(); // 範囲外はnull if(index < 0 || index >= this.size()) return null; return innerList.get(index); } public void add(int index, E element) { // 添字の正規化。-1 が末尾の次になるようにする。 if(index < 0) index += this.size() + 1; if(index < 0){ // 追加したい場所が不明 throw new IndexOutOfBoundsException(); } if(index > this.size()){ // 足りない分を穴埋め int num = index - this.size(); for(int i = 0; i < num; i++){ this.add(null); } } innerList.add(index, element); return; } public E remove(int index) { // 添字の正規化 if(index < 0) index += this.size(); // 範囲外はnull if(index < 0 || index >= this.size()) return null; return innerList.remove(index); } public E set(int index, E element) { // 削除して追加する E original = this.remove(index); this.add(index, element); return original; } }
set()の実装をremove()とadd()を利用してサボってます。
innerList.メソッド()が出て来る部分が、委譲してる部分です。異常値だけ正規化したりトラップして、後はinnerListに丸投げさせてます。