我正在设计一个事件驱动系统,它将带有一些数据的事件发送到队列。队列中的侦听器通过javax.enterprise.event调度消息,我有方法通过observerving限定符监听这些事件。 系统的行为与我期望的一样,但我缺少编译时类型验证。 一些基本代码可以在下面找到:
public interface IEventSender {
void send(final ServerEventTypeEnum serverEventTypeEnum, final IEventData eventData);
}
public class ObservingClientClass{
public void eventAProcessService(@Observes @IEventTypeQualifier(EVENT_1) ServerEventMessage serverEventMessage) {
//handle the event, cast the data to concrete implementation X
(X) serverEventMessage.getEventData()
}
}
public enum ServerEventTypeEnum implements IEventTypeEnum {
EVENT_1,
EVENT_2
}
public interface IEventData extends Serializable{
}
public class X implements IEventData {
}
public class Y implements IEventData {
}
ServerEventTypeEnum只是一些包含事件类型的枚举 支持。
eventData只是实际eventData的通用接口 课程实施。
问题在于,对于EventTypeEnum 1,观察者限定符需要X类型的具体实现,而对于EvenTypeEnum 2,他们期望具体类型Y的eventData。此时观察客户端将IEventData转换为具体类。
这意味着当我将eventData消息发送到队列时,我总是必须检查客户端代码期望接收的内容,并且在运行时存在classcastException的风险。 我想知道是否有某种方式,可能使用泛型,我可以用来在我的send方法中定义预期的实现类型。
我想指定eventType与Enum本身的具体实现之间的关系。我需要在发送'中更改什么?获取编译时类型验证的方法?我想用Enum做的例子:
public enum ServerEventTypeEnum implements IEventTypeEnum {
EVENT_1(X.class),
EVENT_2(Y.class);
private ServerEventTypeEnum(Class concreteImplementationOfTheEventData) {
//set the fields...
}
}
技术: