我有一个第三方库,它有一堆接口和构建器来构造实现接口的对象。然后将这些构造的对象传递到容器中。然后我在我的应用程序中有一个接口,我想添加一个从构建器返回的对象的实现。
第三方
interface ThirdParty1 { ... }
interface ThirdParty2 { ... }
class Builder {
...
public ThirdParty1 build() { ... }
}
class ThirdPartyContainer {
void append(ThirdParty1 toAdd) { ... }
ThirdParty1 take() { ... }
}
我的申请
interface MyInterface { ... }
class MainBody {
ThirdPartyContainer queue;
MainBody() {
ThirdParty1 foo = new Builder().build();
// something to add implementation of MyInterface to foo
queue.append(foo);
}
void calledLater() {
ThirdParty1 bar = queue.take();
if (bar instanceof MyInterface) {
// do something
} else if (bar instanceof ThirdParty2) {
// do something else
}
}
}
我知道我可以构建一个实现ThirdParty1和MyInterface的包装器类,并使用了一个ThirdParty实例,所有实例都调用转发到的地方。但是,这意味着如果Builder.build返回的是ThirdParty1和ThirdParty2的实现,则包装器将丢失ThirdParty2实现。
我希望我所追求的是不可能的,但对于Java和所有可以完成的魔术都是相当新的我并不确定。
答案 0 :(得分:1)
只需实现自己的构建器,构建MyInterface
的实例并将这些对象传递到队列中。
答案 1 :(得分:0)
正如我想要的那样,不可能解决方法是制作包装器:
class Wrapper implements ThirdParty1, MyInterface
{
private ThirdParty1 original;
Wrapper(ThirdParty1 original_) { original=original_; }
// all implemented functions from ThirdParty call said method on original
}
这确实意味着当传回第三方库时,该对象只能被视为ThirdParty1实现,因此可能不会进行优化。如果ThirdParty1有很多方法,那么编写所有转发代码也会有点痛苦。
因此,我们必须采用的替代方法和方法是映射,即
class MainBody {
Map<ThirdParty1, MyInterface> remapper;
ThirdPartyContainer queue;
MainBody() {
ThirdParty1 foo = new Builder().build();
remapper.push(foo, new MyInterface() { ... });
queue.append(foo);
}
void calledLater() {
ThirdParty1 bar = queue.take();
MyInterface ours = remapper.get(bar);
if (ours != null) {
// do something
} else if (bar instanceof ThirdParty2) {
// do something else
}
}
}
此解决方案的问题在于,执行查找的任何内容都需要访问地图。查看地图也会带来性能损失。