Java API-如何让API用户声明自己的类型(然后由API使用)?

Java API-如何让API用户声明自己的类型(然后由API使用)?,java,android,api,Java,Android,Api,我想创建一个库(开始时供自己使用,但可能以后发布,所以我想用正确的方法) 我将使用以下(抽象)示例来解释我的问题: public void onSomeEvent(SomeEvent someEvent) { String action = someEvent.getAction(); EventTypes eventTypes = getEventTypes(); //problem lies with this method for (EventType even

我想创建一个库(开始时供自己使用,但可能以后发布,所以我想用正确的方法)

我将使用以下(抽象)示例来解释我的问题:

public void onSomeEvent(SomeEvent someEvent) {
    String action = someEvent.getAction();

    EventTypes eventTypes = getEventTypes(); //problem lies with this method

    for (EventType eventType : eventTypes) {
        if (eventType.getAction().equals(action)) {
            eventType.onEvent(someEvent);
        }
    }
}

private EventTypes getEventTypes {
    //User should have defined his own event-type-classes by extending EventType:
    //What is the best way to let the user list/define these EventTypes 
    //so my API can access them (e.g. with this method)?  
}
我的问题如示例的注释所示:

让my API的用户为此API的EventReceiver定义自己的EventType,同时满足(在最佳情况下满足所有)以下条件的最佳方法是什么:

  • 事件类型易于为用户定义
  • 不使用反射
  • 用户类型不会在运行时注册,而是静态地列在某个位置(没有注释处理器)
我不知道这些信条是否都能实现(我想不能)

但是如果您忽略了一个或多个标准(第一个标准在任何情况下都不应该是),请向我解释为什么没有更好的方法(不编写我自己的注释处理器)

我希望我的问题很清楚。
如果你认为它不是,请建议我如何使它更精确

如果你认为我漏掉了什么,或者应该采取完全不同的方法,我很乐意你的纠正


提前感谢。

公共列表
公共列表我将定义一个新的界面,您的api用户可以实现:

    public List<? extends EventType> getEventTypes() {
        ...
    }
public interface EventType {
    String getAction ();
    [...]
}
然后实现get方法,以按照以下方式访问事件类型。然后,您还需要一个列表作为类的成员,以及一个添加新事件类型的方法:

private List<EventType> eventTypes = new List<>();

public void addEventType (EventType type) {
    this.eventTypes.add(type);
}

public List<EventType> getEventTypes() {
    return this.eventTypes;
}
private List eventTypes=new List();
public void addEventType(事件类型){
this.eventTypes.add(type);
}
公共列表getEventTypes(){
返回此.eventTypes;
}

API的用户可以通过创建实现接口的新类来定义新的EventType

我将定义一个新接口,api用户可以实现:

public interface EventType {
    String getAction ();
    [...]
}
然后实现get方法,以按照以下方式访问事件类型。然后,您还需要一个列表作为类的成员,以及一个添加新事件类型的方法:

private List<EventType> eventTypes = new List<>();

public void addEventType (EventType type) {
    this.eventTypes.add(type);
}

public List<EventType> getEventTypes() {
    return this.eventTypes;
}
private List eventTypes=new List();
public void addEventType(事件类型){
this.eventTypes.add(type);
}
公共列表getEventTypes(){
返回此.eventTypes;
}

API的用户可以通过创建实现接口的新类来定义新的EventType

使用Java泛型来解决这个问题使用Java泛型来解决这个问题我知道泛型是什么-所以你建议让用户重写
getEventTypes()
,让他返回
EventType
的列表。但用户必须实例化一个新的ArrayList,并“手动”添加类型并返回它们。你是这样做的吗?这真的很简单。我的答案是基于这一行代码:
for(EventType EventType:eventTypes){
--是的,我就是这么做的。但首先我想确保我完全理解你。你能解释一下这个动作吗?因为我对这一行有点困惑:
if(EventType.getAction().equals(action)){
每个事件(SomeEvent和EventType)都有其操作,因此API可以确定将“
SomeEvent
发送到哪个事件类型”。那么,谢谢,这比我想象的要简单得多:)只是要小心过度工程。客户端使用您的库;事件发生;存在与这些事件相关的数据。您需要做的就是定义一个接口,将事件数据传递给客户端,并让客户端定义所需的实现。然后允许客户端注册该事件。从这个意义上说,@CodeLionX的答案更适合您的情况。IMHO,使用字符串来确定某个操作并不像该操作的特定接口方法那样清晰。除非您排除了反射和注释。此外,这些技术增加了很多复杂性和复杂性在Java和Android中,注册实现实例是一件非常标准的事情。我认为要求API客户端添加几行额外的代码以获得API的好处是不合理的。我知道泛型是什么,所以你的建议是什么t是让用户重写
getEventTypes()
并让他返回
eventtypes
s的列表。但随后用户必须实例化一个新的ArrayList,并“手动”添加类型并返回它们。这是您这样做的吗?那真的很简单。我的答案基于这行代码:
for(EventType EventType:eventTypes){
--是的,我会这样做。但首先我想确保我完全理解你。你能解释一下这个动作吗?因为我对这行有点困惑:
如果(EventType.getAction().equals(action)){
每个事件(SomeEvent和EventType)有它的操作,因此API可以确定将“
SomeEvent
”发送到哪个事件类型只需小心过度设计。客户端使用您的库;事件发生;存在与这些事件相关的数据。您只需定义一个接口,将事件数据传递给客户端,并让客户端定义所需的实现。然后允许客户端注册事件。从这个意义上说,@CodeLionX的answer对于您的情况来说更准确一些。嗯,使用字符串来确定某个操作不如该操作的特定接口方法那么清晰。如果不考虑反射和注释(您已经排除了这一点)。此外,这些技术会增加很多复杂性,并增加您的缺陷风险,从而为客户端带来一点好处注册实现实例在Java和Android中是一件非常标准的事情。我认为要求API客户机添加几行额外的代码并不是不合理的