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"
	}

}