java - 向实现类添加功能而不更改实现的接口(interface)

标签 java interface

我有一个接口(interface),它定义了一些用于数据检索的服务方法:

public interface DataReceiver {
    public Data getData();
}

然后我有一个类实现这个接口(interface)并通过连接加载数据。我使用构造函数注入(inject)提供此连接:

public class ConnectionDataReceiver implements DataReceiver {
    private Connection connection;

    public ConnectionDataReceiver(Connection connection) {
        this.connection = connection;
    }

    public Data getData() {
        return connection.query("blabla");
    }
}

这效果非常好。我可以使用构造函数实例化我的 ConnectionDataReceiver 对象,或者我可以添加一个工厂方法/类,通过提供选择用于连接设置的配置文件的选项来扩展可用性。然后,我通过界面使用新类,这样我就可以轻松地交换实现(例如从文件而不是连接加载数据)。

但是如果我想在运行时更改连接而不实例化新的 ConnectionDataReceiver 该怎么办?我必须为我的类(class)添加 getter 和 setter。但由于它们不是我的公共(public)服务定义的一部分,因此我无法将它们放入我的界面中。我可以在代码中使用实现对象来设置新连接,但是仅仅为了更改连接对象而保留对原始对象的引用感觉非常尴尬:

ConnectionDataReceiver conDataRec = new ConnectionDataReceiver(myConnection);
DataReceiver dataRec = conDataRec;
// use dataRec

conDataRec.setConnection(myNewConnection);
// use dataRec again

在此示例中,最简单的方法是实例化一个新的 ConnectionDataReceiver 并重新分配 dataRec,但是如果我的对象的实例化非常昂贵怎么办?如何为我的实现类提供附加功能,同时仍然能够使用我的旧服务接口(interface)?或者当接口(interface)没有定义该功能时,它通常不赞成在运行时更改数据?

最佳答案

您可以做的是在界面中添加以下两个简单的方法:

public void setProperty(String name, Object value);

public Object getProperty(String name);

现在,借助这两个简单方法,您可以在实现类中配置任意数量的附加功能,而无需在 super 中为(实现类的)新功能添加新方法。类型。

该模式用于以下界面:

com.ibm.msg.client.jms.JmsQueueConnectionFactory

界面有setCharProperty , setDoubleProperty , setFloatProperty等等,这样当他们发布新的实现时,他们就不必修改接口(interface)。

关于java - 向实现类添加功能而不更改实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37639922/

相关文章:

java - 无法在 Android 中使用 BroadcastReceiver 上下文初始化接口(interface)

c - Swig 的替代品?

c# - 为什么有些结构继承接口(interface),但不实现其所有成员?

Java 邮件 : No provider for smtp

java - 获取两个具有重复元素的数组列表之间的差异

java - Android 读取文件和偶尔不正确的值

javascript - Angular 4+ 通过接口(interface)从子级向父级发送服务

java - 在 GridBagLayout 中展开 JTextArea

java - Android-卡在正在运行的项目上

c# - 根据参数类型调用函数