Java - 为来自外部库的类定义一个通用接口
Posted
技术标签:
【中文标题】Java - 为来自外部库的类定义一个通用接口【英文标题】:Java - Define a common interface for classes from an external library 【发布时间】:2021-10-14 20:20:14 【问题描述】:我正在使用具有 A 和 B 类的外部库(我无法修改),它们都有 2 个名称相同的 getter(getter1 和 getter2)。
A 和 B 之间没有关系,没有定义 2 个 getter 的超类或接口。
在我的代码中,我想创建一个方法,其参数可以是 A 和 B 类型,我想在其上调用 getter(不关心传递的参数是 A 还是 B 的实例) .
我可以用 getter1 和 getter2 声明一个接口,但我不能强制类 A 和 B 实现这个接口,因为它们驻留在外部代码中。
对于我的代码中的方法,什么是优雅的解决方案?
我不想有 2 种相同的方法,一种带有 A 参数,一种带有 B 参数。
【问题讨论】:
A类和B类是最终的吗? 【参考方案1】:如果A
和B
都不是final
,那么您可以使用Adapter Pattern。
创建一个接口,其中定义了所需的两个方法,例如Adapter
.
interface Adapter
String getter1();
String getter2();
创建A
和B
的子类,每个子类都实现Adapter
。
public class AAdapter extends A implements Adapter
public class BAdapter extends B implements Adapter
那么您的方法可以采用Adapter
类型的对象。
如果您不能执行上述操作,因为其中至少有一个是final
,那么您将不得不使用组合而不是继承。不要继承 A
和 B
,而是将它们包装在 Adapter 类中。
class AAdapter implements Adapter
A a;
public AAdapter(A a) this.a = a;
@Override public String getter1()
return a.getter1();
@Override public String getter2()
return a.getter2();
class BAdapter implements Adapter
B b;
public BAdapter(B b) this.b = b;
@Override public String getter1()
return b.getter1();
@Override public String getter2()
return b.getter2();
【讨论】:
【参考方案2】:我建议创建自己的 A' 和 B' 类,它们使用两个类共享的方法实现相同的接口。每个类都应包含相应库类的实例,然后简单地委托(通过调用)该类的方法。这样,您就不会受到方法被称为相同的限制。缺点是额外的样板代码。但这样做的好处是,如果需要,可以很容易地适应第三个库(例如 C)。
搜索“委托模式”了解更多信息。
【讨论】:
以上是关于Java - 为来自外部库的类定义一个通用接口的主要内容,如果未能解决你的问题,请参考以下文章