当前位置: 首页 > 知识库问答 >
问题:

是否可以将默认实现添加到表示监听器的接口的方法中?

杨豪
2023-03-14

有一个我在我的项目中使用的库。这个库有一个包含大约15个方法的接口。

此接口的目的是使订阅库中生成的一些事件成为可能。应用程序中的侦听器类可以实现该接口,并将自身注册为库中的侦听器以接收事件。

这个接口中的所有方法实际上都是事件。可以有监听器,这些监听器只需要从接口中的许多事件中接收一个或两个事件。即使侦听器只对少数事件感兴趣,但在扩展接口时侦听器必须实现所有的方法。

所以我要求这个库的开发人员向接口中的方法添加空的默认实现。

但是库开发人员拒绝添加默认实现,声明这将违反java最佳实践,并且在接口方法中使用默认实现与接口的目的背道而驰。

但是,正如我所理解的,这个接口中的一个方法并没有指定这个接口的实现者应该能够执行的一些操作。该接口中的方法定义了一个实现者可能感兴趣的事件。所以我看不到不添加默认实现的明确理由。

那么,向该接口添加默认实现是否破坏了java最佳实践呢?

共有1个答案

陆沈浪
2023-03-14

但是库开发人员拒绝添加默认实现,声明这将违反java最佳实践,并且在接口方法中使用默认实现与接口的目的背道而驰。

在引入默认接口方法之前,此参数一直有效。现在,您的同事不得不争辩说,Java8的JLS扭曲了接口,而JDK现在包含的类违背了接口的目的。然而,这是一个可行的极端立场,但没有结果。

您可以通过从库接口派生一个自己的接口并为所有继承的方法提供默认的空实现来避免讨论。

public interface MyInterface extends LibraryInterface {
    @Override default public void event1() {
    }

    ...
}

或者,你们两个也可以回顾一下下面的设计,我觉得这个设计很可疑,也正是这个设计引发了你们对接口中默认方法的讨论:

即使侦听器只对少数事件感兴趣,但在扩展接口时侦听器必须实现所有的方法。

一个解决方案可以是简单地将大的接口拆分成许多小的接口。

 类似资料:
  • 问题内容: 我想将鼠标悬停在我创建的SpanElement的侦听器上: 我在Google中找到了如何使用Label-wrapper做到这一点,但我想在没有任何包装的情况下做到这一点。可能吗? 谢谢。 问题答案: 也可以不使用JSNI。 因此,与您的元素: 将事件侦听器直接添加到元素: …而且看起来确实很丑陋;)正如您所注意到的那样,对于此元素构想的所有dom事件,事件侦听器都是“公共的”。因此,为

  • 本文向大家介绍修改Oracle监听默认端口号1521的方法,包括了修改Oracle监听默认端口号1521的方法的使用技巧和注意事项,需要的朋友参考一下 前言 大家都知道在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,下面在这里,教大家如何修改oracle默认端口号为9999 方法如下 1、查看监听状态 可以看到

  • 下面是一个简单的例子,展示了我的问题: 在中,我提供了方法和的实现,这是来自的唯一抽象方法。但是,当我编译时,我仍然会遇到以下错误: 类型MyWork必须实现继承的抽象方法AbstractCollection.size() 或者 我的任务。java:3:错误:MyTask不是抽象的,并且不重写AbstractList中的抽象方法get(int) (取决于编译器)。当然,我使用的是java 8。 所

  • 我不知道如何在comboxbox上实现焦点侦听器。我知道这不是一件简单的事情,但其他人似乎已经让它工作[1][2][3],但是在仔细检查每个结果后,我无法复制他们的结果。在网络上进行了广泛的搜索,查看了最新的Oracle指南,Oracle文档等之后,我来到了这里。我的问题很简单: 目标是创建一个与谷歌搜索基本相同的字段。您可以输入搜索查询,它将在文本字段下方的下拉列表中填充可能的搜索匹配项。如果所

  • 问题内容: Java 8在接口上引入了默认方法和静态方法。因此,现在无论使用默认方法还是静态方法,您都可以在界面中实现具体的实现。 Java声称添加这两种新方法的原因是“确保与为那些接口的较旧版本编写的代码二进制兼容”。 我的问题: 为什么为了支持现有的体系结构问题而扭曲应该完全抽象的接口原始概念? 使用抽象类和新版本的接口之间的区别除了一个类具有扩展多个接口的能力之外,还有什么区别? 问题答案:

  • Java8在接口上引入了默认和静态方法。因此,现在您可以在接口中有具体的实现,不管是使用默认方法还是静态方法。 Java声称添加这两种新方法的原因是“确保与为这些接口的旧版本编写的代码的二进制兼容性”。 null