Domanda

Ho un BlockingQueue implementazione che viene utilizzato in una situazione di produttore-consumatore. Vorrei per decorare questa coda in modo che ogni oggetto che ha preso da esso viene registrato. So quello che l'attuazione immediata sarà simile: è sufficiente implementare BlockingQueue e accettare un BlockingQueue nel costruttore al quale tutti i metodi sarebbe delegare. C'è un altro modo che mi manca? Una biblioteca forse? Qualcosa con un'interfaccia di richiamata?

È stato utile?

Soluzione

In alternativa si potrebbe desiderare di prendere in considerazione è dinamica proxy . Ciò consente di utilizzare un'API di riflessione in stile, al fine di elaborare le richieste effettuate su una determinata interfaccia - sarebbe molto semplice da delegare tutte le chiamate a un'implementazione sottostante, mentre l'aggiunta di una logica di registrazione se il nome del metodo abbinato uno dei metodi take.

Lo svantaggio di questo approccio è che aggiunge un po 'di overhead in più per tutte le chiamate di metodo (quasi certamente trascurabile per uso generale anche se questo dovrebbe essere una bandiera gialla, se utilizzato in una sezione performance-critica), e il codice può finire per guardare ingombrante. In definitiva quello che stai facendo è definire esattamente lo stesso comportamento che descrivi nel tuo post, tranne che non c'è bisogno di scrivere ogni metodo di delega in modo esplicito, ma di fornire una sorta di implementazione jolly.

Altri suggerimenti

avrei pensato che sarebbe stato più semplice per creare una classe che estende la classe di implementazione rilevante per l'interfaccia BlockingQueue, e sostituisce il metodo remove, e altri come richiesto.

Modifica

La creazione di un wrapper è una migliore applicazione se l'OP sta usando più di un'implementazione di BlockingQueue, ma introduce un piccolo calo di prestazioni su tutti operazioni, e altre questioni minori.

Il mio punto è che l'estensione della classe di coda è un'alternativa a avvolgendolo. Che si tratti di una migliore alternativa dipende dalle circostanze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top