Usar composición no se extiende (sí, me refiero a extensiones, como en una referencia a la palabra clave extend en java y sí, esto es herencia). La composición es superior porque protege completamente su implementación, permitiéndole cambiarla sin afectar a los usuarios de su clase.
Recomiendo probar algo como esto (estoy escribiendo directamente en esta ventana, así que el comprador tenga cuidado con los errores de sintaxis):
public LimitedSizeQueue implements Queue
{
private int maxSize;
private LinkedList storageArea;
public LimitedSizeQueue(final int maxSize)
{
this.maxSize = maxSize;
storageArea = new LinkedList();
}
public boolean offer(ElementType element)
{
if (storageArea.size() < maxSize)
{
storageArea.addFirst(element);
}
else
{
... remove last element;
storageArea.addFirst(element);
}
}
... the rest of this class
Una mejor opción (basada en la respuesta de Asaf) podría ser envolver el Apache Collections CircularFifoBuffer con una clase genérica. Por ejemplo:
public LimitedSizeQueue<ElementType> implements Queue<ElementType>
{
private int maxSize;
private CircularFifoBuffer storageArea;
public LimitedSizeQueue(final int maxSize)
{
if (maxSize > 0)
{
this.maxSize = maxSize;
storateArea = new CircularFifoBuffer(maxSize);
}
else
{
throw new IllegalArgumentException("blah blah blah");
}
}
... implement the Queue interface using the CircularFifoBuffer class
}