在方法调用之间键入用户数据的安全隧道

时间:2014-06-07 14:54:20

标签: java generics interface

我正在开发一个API,允许用户使用某种协议传输数据。在整个通信过程中,会发生两个事件 - EventA和EventB。 B是可选的,但与A密切相关。它们出现在序列(AB?)*中。此事件作为对接口的挂钩调用向用户公开:

interface IEventHandler {
    void eventAOccured(EventAData aData);
    void eventBOccured(EventBData bData);
}

现在我希望用户能够将事件A的一些数据传递给事件B的钩子,同时保持接口无状态。首先我想的是

interface IEventHandler<U> {
    U eventAOccured(EventAData aData);
    void eventBOccured(EventBData bData, U userData);
}

不幸的是,由于泛型不提供运行时信息(至少没有反射),API无法调用eventBOccured,因为在编译时不知道其第二个参数的类型。引入标记接口并U extends IMarker解决了这个问题,但是没有考虑我想要避免的上传。恕我直言,如果我愿意接受上传,我可以简单地通过Object并获得同样的结果。

我很确定(Java)泛型是错误的工具。我错过了什么吗?你会如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我会这样做: 包com.stackoverflow.user3590895.questions24098455;

//-------------------------------
package com.stackoverflow.user3590895.questions24098455;

public class EventData implements IEventData{

    //default is type A
    private int type=IEventData.TYPE_A;

    @Override
    public int getType() {
        System.out.print("Event [type:"+type+"]!");
        return type;
    }


}
//-------------------------------
package com.stackoverflow.user3590895.questions24098455;

public interface IEventData {
    public static char TYPE_A='A';
    public static char TYPE_B='B';

    public int getType();
}

//-------------------------------
package com.stackoverflow.user3590895.questions24098455;

public interface IEventHandler<U> {
    U eventOccured(IEventData data);
}

使用案例 - 拨打活动电话(有您选择的活动) - api catch事件,可以通过调用函数getType来了解他的类型。 - 如果你是eventData B,你可以使用EventData,并为B Type创建一个新的EventData。您可以为EventDataB添加一些特定功能,也可以添加特定数据。

给我反馈。

答案 1 :(得分:0)

如果我正确理解,您可以使用包含其类定义的数据的包装器。像

这样的东西
class Wrapper<U extends IMarker> {
    U data;
    Class<U> clazz;
    // constructor, getters and setters omitted
}

您的活动界面将是

interface IEventHandler<U extends IMarker> {
    Wrapper<U> eventAOccured(EventAData aData);
    void eventBOccured(EventBData, Wrapper<U> user data);
}

这样,Wrapper类已知,API可以毫无问题地调用它。在eventBOccured中,你有适合你的上传类型。