最も古いデータを捨てるリスト #1

要は、制限された容量を持ち、それを超えてデータを追加する場合は最も以前に追加されたデータを消すリスト。
使い方の制約として、データの追加は1個ずつ、参照は格納データ全部を追加された順に走査する、ということにする。
素直に楽するならLinkedListで実装する方法か。

LRAList.java
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/** the list that discards Least Recently Added */
public class LRAList<E> implements Iterable<E> {
    private LinkedList<E> list = new LinkedList<E>();
    private int capacity;

    public LRAList(int capacity) {
        if (capacity < 0) throw new IllegalArgumentException("negative capacity:" + capacity);
        this.capacity = capacity;
    }

    public boolean add(E e) {
        if (capacity == 0) return false;
        if (list.size() == capacity) list.removeFirst();
        return list.offer(e);
    }

    public Iterator<E> iterator() {
        return list().iterator();
    }

    public List<E> list() {
        return Collections.unmodifiableList(list);
    }
}

LinkedListを継承しないのは、とりあえず不要なのにそのままでは機能に影響するメソッドを再定義しなくて済むようにしている。
とはいえListインタフェイスくらいは利用したいことがあるかもしれないので変更不可能なビューを返すようなメソッドもある。