以下是一个示例代码,演示如何编写一个漂亮的、类型安全的通用事件到处理程序分配函数:
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
public class EventDispatcher {
private Map, Consumer extends Event>> eventHandlers;
public EventDispatcher() {
eventHandlers = new HashMap<>();
}
public void addEventHandler(Class eventType, Consumer eventHandler) {
eventHandlers.put(eventType, eventHandler);
}
public void dispatchEvent(Event event) {
Consumer extends Event> eventHandler = eventHandlers.get(event.getClass());
if (eventHandler != null) {
eventHandler.accept(event);
} else {
throw new UnsupportedOperationException("No event handler found for " + event.getClass().getName());
}
}
}
class Event {
// Base event class
}
class UserLoggedInEvent extends Event {
// Event subclass
private String userId;
public UserLoggedInEvent(String userId) {
this.userId = userId;
}
public String getUserId() {
return userId;
}
}
class UserLoggedOutEvent extends Event {
// Event subclass
private String userId;
public UserLoggedOutEvent(String userId) {
this.userId = userId;
}
public String getUserId() {
return userId;
}
}
class Main {
public static void main(String[] args) {
EventDispatcher eventDispatcher = new EventDispatcher();
// Add event handlers
eventDispatcher.addEventHandler(UserLoggedInEvent.class, event -> {
UserLoggedInEvent loggedInEvent = (UserLoggedInEvent) event;
System.out.println("User logged in: " + loggedInEvent.getUserId());
});
eventDispatcher.addEventHandler(UserLoggedOutEvent.class, event -> {
UserLoggedOutEvent loggedOutEvent = (UserLoggedOutEvent) event;
System.out.println("User logged out: " + loggedOutEvent.getUserId());
});
// Dispatch events
Event loginEvent = new UserLoggedInEvent("123");
Event logoutEvent = new UserLoggedOutEvent("123");
eventDispatcher.dispatchEvent(loginEvent);
eventDispatcher.dispatchEvent(logoutEvent);
}
}
在上述示例中,我们首先定义了一个EventDispatcher
类,它具有一个eventHandlers
映射,用于存储事件类型和事件处理程序的关联关系。addEventHandler
方法用于将指定事件类型的处理程序添加到映射中。
dispatchEvent
方法接收一个Event
对象作为参数,并根据事件类型查找对应的事件处理程序。如果找到了对应的处理程序,则通过accept
方法将事件传递给处理程序进行处理。如果没有找到对应的处理程序,则抛出一个异常。
在Main
类中,我们创建了一个EventDispatcher
对象,并添加了两个事件处理程序:一个用于处理UserLoggedInEvent
事件,另一个用于处理UserLoggedOutEvent
事件。然后,我们分别创建一个UserLoggedInEvent
对象和一个UserLoggedOutEvent
对象,并将它们传递给eventDispatcher
的dispatchEvent
方法,从而触发相应的事件处理程序。
这种通用事件到处理程序分配函数的解决方法是类型安全的,因为它使用泛型参数和限定,确保了事件和事件处理程序之间的类型一致性。同时,它也具有良好的可扩展性和可维护性,可以方便地添加、删除或修改事件类型和事件处理程序的关联关系。