Часто предпочтительной альтернативой для подклассов является (* к сожалению названный) шаблон " pimp my library ". Вы можете использовать его для добавления метода enqueueFinite
к Queue
, например:
import scala.collection.immutable.Queue
class FiniteQueue[A](q: Queue[A]) {
def enqueueFinite[B >: A](elem: B, maxSize: Int): Queue[B] = {
var ret = q.enqueue(elem)
while (ret.size > maxSize) { ret = ret.dequeue._2 }
ret
}
}
implicit def queue2finitequeue[A](q: Queue[A]) = new FiniteQueue[A](q)
Всякий раз, когда queue2finitequeue
находится в области видимости, вы можете обрабатывать Queue
объекты, как если бы они имели метод enqueueFinite
:
val maxSize = 3
val q1 = Queue(1, 2, 3)
val q2 = q1.enqueueFinite(5, maxSize)
val q3 = q2.map(_+1)
val q4 = q3.enqueueFinite(7, maxSize)
Преимущество этого подхода перед подклассами заключается в том, что enqueueFinite
доступен для всех Queue
с, включая те, которые создаются с помощью таких операций, как enqueue
, map
, ++
и т. Д.
Обновление : Как говорит Дилан в комментариях, enqueueFinite
необходимо также принять параметр для максимального размера очереди и отбросить элементы по мере необходимости. Я обновил код.