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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top