Java编译时间参数相互依赖性

时间:2017-08-22 07:44:07

标签: java generics enums compilation

我正在设计一个事件驱动系统,它将带有一些数据的事件发送到队列。队列中的侦听器通过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的通用接口 课程实施。

  • ServerEventMessage只是一个包装类,它包含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...
    }
}

技术:

  • Java SE 8
  • Java EE 7

0 个答案:

没有答案