Solución:
Las colecciones 4 de Apache commons tienen un CircularFifoQueue <> que es lo que está buscando. Citando el javadoc:
CircularFifoQueue es una cola de primero en entrar, primero en salir con un tamaño fijo que reemplaza su elemento más antiguo si está lleno.
import java.util.Queue;
import org.apache.commons.collections4.queue.CircularFifoQueue;
Queue<Integer> fifo = new CircularFifoQueue<Integer>(2);
fifo.add(1);
fifo.add(2);
fifo.add(3);
System.out.println(fifo);
// Observe the result:
// [2, 3]
Si está utilizando una versión anterior de las colecciones de Apache commons (3.x), puede utilizar CircularFifoBuffer, que es básicamente lo mismo sin genéricos.
Actualizar: respuesta actualizada tras el lanzamiento de la versión 4 de colecciones comunes que admite genéricos.
Guava ahora tiene una EvictingQueue, una cola sin bloqueo que desaloja automáticamente los elementos del encabezado de la cola cuando intenta agregar nuevos elementos a la cola y está llena.
import java.util.Queue;
import com.google.common.collect.EvictingQueue;
Queue<Integer> fifo = EvictingQueue.create(2);
fifo.add(1);
fifo.add(2);
fifo.add(3);
System.out.println(fifo);
// Observe the result:
// [2, 3]
Me gusta la solución @FractalizeR. ¡Pero además conservaría y devolvería el valor de super.add (o)!
public class LimitedQueue<E> extends LinkedList<E> {
private int limit;
public LimitedQueue(int limit) {
this.limit = limit;
}
@Override
public boolean add(E o) {
boolean added = super.add(o);
while (added && size() > limit) {
super.remove();
}
return added;
}
}