2012-10-15 22 views
5

Ho cercato su Google per imparare come creare eventi personalizzati e listener di eventi. Dopo aver letto alcuni articoli a riguardo, sono ancora confuso. Vorrei chiedere a voi ragazzi una revisione di i modi per creare eventi personalizzati (eventi non correlati alla GUI) e gestori. Alcuni possono fornire una semplice spiegazione su come creare eventi e ascoltatori personalizzati?Eventi Java e listener di eventi

risposta

6

Che, fondamentalmente, di creare un'interfaccia come l'ascoltatore come

public interface EatListener { 

    ... 

} 

all'interno della classe EatListener, avete metodo che si chiama con l'evento come parametro del metodo; come

public void onEat(EatEvent); 

quindi si può avere una classe come Human che implementa o crea un'istanza di EatListener; come

public class Human { 

    private EatListener listener; 

    public void eatFood(Food food) { 
     if(listener != null) { 
      listener.onEat(new EatEvent(food)); 
     } 
    } 

} 

quindi è necessario disporre di EatEvent effettivo; che può essere semplice come wrapper per il cibo con possibilmente alcuni dati extra.

Come con qualsiasi interfaccia grafica su Java è possibile creare classi interne anonime da tale interfaccia:

new EatListener() { 
    public void onEat(EatEvent event) { 
     System.out.println("I just ate " + event.getFood().getName()); 
    } 
} 
1

ho scritto un sacco di sistemi basati su eventi (non GUI) e ci sono molti trucchi per l'attuazione proprio . Alcune delle cose classiche sono threading e perdite di memoria.

Controllo threading/processo significa semplicemente che quando si attiva un evento, quando viene richiamato l'ascoltatore, immediatamente o successivamente? Se si attiva immediatamente, si può finire con un sistema con prestazioni davvero scadenti che reagisce costantemente a un evento che cambia immediatamente dopo che il listener è stato richiamato. Non c'è una risposta facile qui, e in realtà dipende dal tuo bisogno. In generale, se riesci a rinviare l'attivazione di un evento, avrai un sistema migliore (perché potrebbe evitare di chiamare più volte l'ascoltatore per lo stesso evento - o un ciclo di eventi che porta allo stesso evento)

Il secondo grande trucchetto è la perdita di memoria. La mancanza di eliminazione in Java è una cosa bella, ma gli ascoltatori sono una pistola gigante che è legata al tuo piede. Se si dispone di un listener collegato a un'istanza che utilizza un carico di memoria, a condizione che un altro oggetto contenga un riferimento a quel listener, tale memoria verrà sospesa. Ci sono un sacco di soluzioni a questo, come WeakReferences, ma in generale, devi essere abbastanza attento ed esaminare il numero di ascoltatori quando stai testando la tua applicazione e assicurati che si stacchino (non in elenco? :)) con garbo.

In breve, se fossi in te, vorrei prendere in considerazione usando qualcosa come: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html http://codingjunkie.net/guava-eventbus/ che è stato sviluppato con molti di questi problemi in mente.

Problemi correlati