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】:

如果AB 都不是final,那么您可以使用Adapter Pattern。

创建一个接口,其中定义了所需的两个方法,例如Adapter.

interface Adapter 
    String getter1();
    String getter2();

创建AB 的子类,每个子类都实现Adapter

public class AAdapter extends A implements Adapter 

public class BAdapter extends B implements Adapter 

那么您的方法可以采用Adapter 类型的对象。

如果您不能执行上述操作,因为其中至少有一个是final,那么您将不得不使用组合而不是继承。不要继承 AB,而是将它们包装在 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 - 为来自外部库的类定义一个通用接口的主要内容,如果未能解决你的问题,请参考以下文章

C# 实体框架向来自外部库的实体添加新列

使用通用 java 接口获取意外参数类型并实现

来自通用模型定义的两种语言的 ORM 实体类生成器

如何在Java中使用通用接口获取实现类中的方法

静态库的创建和使用,制作通用静态库

面试