Ciao, di solito gli eventi dovrebbero estendere la classe EventObject, che è stata pensata proprio per questo scopo.
Un esempio è il seguente: c'è una classe che fa da contatore e vogliamo essere avvisati quando questa assume un valore negativo.
Classe CounterNegativeEvent.java (l'evento "personalizzato")
import java.util.EventObject;
public class CounterNegativeEvent extends EventObject {
private static final long serialVersionUID = 1L;
private int count;
public CounterNegativeEvent(Object source, int count) {
super(source);
this.count = count;
}
public int getCount() {
return count;
}
}
Classe CounterNegativeEventListener.java (il "contratto" che i listeners devono rispettare):
public interface CounterNegativeEventListener {
public void onCounterNegativeEvent(CounterNegativeEvent ev);
}
Classe Counter.java (il nostro contatore):
import java.util.LinkedList;
import java.util.List;
public class Counter {
private List<CounterNegativeEventListener> listeners;
private int count;
public Counter() {
listeners = new LinkedList<CounterNegativeEventListener>();
count = 0;
}
public void addCustomEventListener(CounterNegativeEventListener listener) {
this.listeners.add(listener);
}
public void removeCustomEventListner(CounterNegativeEventListener listener) {
this.listeners.remove(listener);
}
public void setCount(int count) {
this.count = count;
if (count < 0) {
CounterNegativeEvent ev = new CounterNegativeEvent(this, getCount());
for (CounterNegativeEventListener listener : listeners) {
listener.onCounterNegativeEvent(ev);
}
}
}
public int getCount() {
return count;
}
}
Il main:
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
// creo un listener come classe anonima
CounterNegativeEventListener listener = new CounterNegativeEventListener() {
@Override
public void onCounterNegativeEvent(CounterNegativeEvent ev) {
System.out.println("The counter is negative: "+ev.getCount());
}
};
counter.addCustomEventListener(listener);
counter.setCount(3); // non stampa nulla
counter.setCount(-2); // stampa "The counter is negative: -2"
}
}