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に丸投げさせてます。