添加现有Object的接口

时间:2017-02-17 14:00:28

标签: java

我有一个第三方库,它有一堆接口和构建器来构造实现接口的对象。然后将这些构造的对象传递到容器中。然后我在我的应用程序中有一个接口,我想添加一个从构建器返回的对象的实现。

第三方

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和所有可以完成的魔术都是相当新的我并不确定。

2 个答案:

答案 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
    }
  }
}

此解决方案的问题在于,执行查找的任何内容都需要访问地图。查看地图也会带来性能损失。