这是一个复杂的问题,但是我会尽力解释它。
首先,请考虑以下课程。
public abstract class Invokable {
private String name;
protected Invokable(String name) { ... }
public String getName() { ... }
public abstract void invoke();
}
public class PrintInvokable extends Invokable {
public PrintInvokable() {
super("print");
}
@Override
public void invoke() { ... }
}
另一个类InvokerDispatcher
处理来自消息传递应用程序的事件,并根据Invokable#invoke
字段在适当实现的实例上调用name
。这一切都是反思性地完成的,以便能够扫描类路径中所有有效的Invokable
实现,并在运行时动态加载它们。
这里的问题是我只能通过实例访问name
,因此我必须实例化每个Invokable
的副本,以便根据消息内容检查其名称。现在,我的解决方案是将每个实现的预先实例化的副本的列表保存在单独的类中,然后调用一个方法,该方法按名称从列表中获取并替换实例。
我希望能够静态地访问name
,但是我无法提出强制性的方法。在static abstract getName()
中使用Invokable
是最简单的方法,但是不幸的是Java不支持它。有什么想法吗?
我对这个问题的抽象可能不是最好的,所以here's my actual source code。相关类位于command
包中。