Вопрос

у меня есть BlockingQueue внедрение, которое используется в продюсер-потребительской ситуации. Я хотел бы украсить эту очередь, чтобы каждый объект, который взял из него, зарегистрирован. Я знаю, что выглядит простая реализация: просто реализовать BlockingQueue и принять А. BlockingQueue в конструкторе, к которому все методы будут делегировать. Есть ли другой способ, которым я скучаю? Библиотека возможно? Что-то с интерфейсом обратного вызова?

Это было полезно?

Решение

Альтернатива вы можете пожелать рассмотреть это динамические прокси. Отказ Это позволяет вам использовать API стиль отражения, чтобы обработать запросы, сделанные на данном интерфейсе - было бы очень простым, чтобы делегировать все вызовы в базовую реализацию, при добавлении какой-либо логики ведения журнала, если имя метода соответствовало одному из методов.

Недостатком такого подхода является то, что он добавляет немного дополнительных накладных расходов на все вызовы методов (почти наверняка незначительным для общего использования, хотя это должно быть желтым флагом, если используется в критическом выпуске), и код может в конечном итоге выглядеть громоздким Отказ В конечном итоге то, что вы делаете, это определяет точно такое же поведение, которое вы описываете в вашем посте, за исключением того, что вам не нужно писать каждый делегирующий метод явно, но предоставить свой вид реализации подстановки.

Другие советы

Я бы подумал, что будет проще создать класс, который расширяет соответствующий класс реализации для BlockingQueue Интерфейс и переопределяет remove метод, а другие по мере необходимости.

РЕДАКТИРОВАТЬ

Создание обертки - лучшая реализация, если OP использует более одной реализации BlockingQueue, но он вводит небольшой удар производительности на все Операции и другие незначительные проблемы.

Моя точка зрения заключается в том, что расширение класса очереди - это альтернатива для упаковки. То есть ли это лучшая альтернатива зависит от обстоятельств.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top