Blocking Dekorateur, dass Protokolle Objekte entfernt
-
04-10-2019 - |
Frage
Ich habe eine BlockingQueue
Implementierung, die in einer Erzeuger-Verbraucher-Situation verwendet werden wird. Ich mag diese Warteschlange dekorieren, so dass jedes Objekt, das von ihr genommen ist angemeldet ist. Ich weiß, was die einfache Implementierung aussehen würde: einfach BlockingQueue
implementieren und einen BlockingQueue
im Konstruktor akzeptieren, auf die alle Methoden delegieren würde. Gibt es eine andere Art und Weise, dass ich fehle? Eine Bibliothek vielleicht? Etwas mit einer Callback-Schnittstelle?
Lösung
Eine Alternative können Sie betrachten wollen dynamische Proxies . Auf diese Weise können Sie eine reflexions Stil API, um Prozessanforderungen auf eine bestimmte Schnittstelle gemacht verwenden - es wäre sehr einfach, alle Anrufe an eine zugrunde liegende Implementierung zu delegieren, während einige Protokollierung Logik hinzufügen, wenn der Methodenname eines der Aufnahmemethoden abgestimmt.
Der Nachteil dieses Ansatzes ist, dass es ein wenig zusätzlichen Aufwand für alle Methodenaufrufe ergänzt (mit ziemlicher Sicherheit zu vernachlässigen für die allgemeinen Gebrauch, obwohl dies eine gelbe Flagge, wenn in einem leistungskritischen Abschnitt verwendet werden soll), und der Code am Ende up suchen umständlich. Letztlich, was Sie tun genau das gleiche Verhalten wird definiert, dass Sie in Ihrem Beitrag beschreiben, außer dass Sie nicht jede delegierenden Methode explizit zu schreiben brauchen aber eine Art wildcarded Umsetzung.
Andere Tipps
Ich hätte gedacht, dass es einfacher wäre, eine Klasse zu erstellen, die die entsprechende Implementierungsklasse für die BlockingQueue
Schnittstelle erweitert und überschreibt die remove
Verfahren und andere, wie erforderlich.
Bearbeiten
einen Wrapper zu schaffen, ist eine bessere Umsetzung, wenn die OP mehr als eine Implementierung von BlockingQueue
verwendet, aber es führt eine kleine Performance-Einbußen auf alle Operationen und andere kleinere Probleme.
Mein Punkt ist, dass die Warteschlange Klasse erstreckt, ist eine Alternative es zu wickeln. Ob es eine bessere Alternative, hängt von den Umständen ab.