Как уже упоминалось в этом SO ответе и других постах в том же вопросе, делегаты C # могут быть реализованы с использованием интерфейсов или Java FuncationInterfaces.
Однако я хочу реализовать правильную модель событий, а не модель делегата в Java. Для краткого изложения различий, пожалуйста, смотрите this . Особенно первый комментарий.
Вот что я пробовал до сих пор:
Event.java
public class Event {
public interface EventHandler{
void invoke();
}
private Set<EventHandler> mEventHandlers = new HashSet<>();
public void add(EventHandler eventHandler){
mEventHandlers.add(eventHandler);
}
public void remove(EventHandler eventHandler){
mEventHandlers.remove(eventHandler);
}
public void invoke(){
for(EventHandler eventHandler : mEventHandlers){
if(eventHandler!=null) {
eventHandler.invoke();
}
}
}
}
EventPubisher.java
public class EventPublisher {
public Event ValueUpdatedEvent;
public void UpdateValue(){
ValueUpdatedEvent.invoke();
}
}
EventConsumer.java
public class EventConsumer {
EventPublisher ep = new EventPublisher();
public EventConsumer(){
ep.ValueUpdatedEvent.add(this::ValueUpdatedEventHandler);
}
private void ValueUpdatedEventHandler(){
// do stuff
}
}
Проблема с этим дизайном заключается в том, что я могу написать код, как показано ниже:
public class EventConsumer {
.....
private void abuse(){
ep.ValueUpdatedEvent.invoke();
}
}
И это именно то, что ограничивают события. Событие должно быть инициировано только из декларирующего класса, а не извне.