В Java у вас нет делегатов функций (фактически ссылки на методы);Вы должны передать весь класс, реализующий определенный интерфейс.Например,
class Producer {
// allow a third party to plug in a listener
ProducerEventListener my_listener;
public void setEventListener(ProducerEventListener a_listener) {
my_listener = a_listener;
}
public void foo() {
...
// an event happened; notify the listener
if (my_listener != null) my_listener.onFooHappened(new FooEvent(...));
...
}
}
// Define events that listener should be able to react to
public interface ProducerEventListener {
void onFooHappened(FooEvent e);
void onBarOccured(BarEvent e);
// .. as many as logically needed; often only one
}
// Some silly listener reacting to events
class Consumer implements ProducerEventListener {
public void onFooHappened(FooEvent e) {
log.info("Got " + e.getAmount() + " of foo");
}
...
}
...
someProducer.setEventListener(new Consumer()); // attach an instance of listener
Часто у вас есть тривиальные слушатели, которые вы создаете с помощью анонимных классов:
someProducer.setEventListener(new ProducerEventListener(){
public void onFooHappened(FooEvent e) {
log.info("Got " + e.getAmount() + " of foo");
}
public void onBarOccured(BarEvent e) {} // ignore
});
Если вы хотите разрешить много слушателей на событие (как, например, компоненты GUI)Вы управляете списком, который обычно хотите синхронизировать, и имеете для его управления addWhateverListener
и removeWhateverListener
.
Да, этот является безумно громоздким.Твои глаза не лгут тебе.