我的项目中使用了某个库.该库有一个接口,有大约15种方法.
此接口的目的是使订阅库中生成的某些事件成为可能.应用程序中的侦听器类可以实现此接口,并将自身注册为库中的侦听器以接收事件.
此接口中的所有方法实际上都是事件.可以有听众只需要从界面中的许多事件中仅接收一个或两个事件.即使监听器只对少数事件感兴趣,监听器也必须在扩展接口时实现所有方法.
所以我要求这个库的开发人员在界面中的方法中添加空的默认实现.
但是库开发人员拒绝添加默认实现,声称它违反了Java最佳实践,并且在接口方法中使用默认实现违背了接口的目的.
但是,据我所知,此接口中的方法未指定此接口的实现者应该具有的某些操作.此接口中的方法确定了实现者可能感兴趣的事件.因此,我看不出没有添加默认实现的明确原因.
那么,在这个界面添加默认实现是否打破了java最佳实践?
但是库开发人员拒绝添加默认实现,声称它违反了Java最佳实践,并且在接口方法中使用默认实现违背了接口的目的.
在引入默认接口方法之前,此参数有效.现在你的同事必须争辩说Java 8的JLS变换了接口,而JDK现在包含了违背接口目的的类.这仍然是一个可行的极端立场,但毫无结果.
您可以通过从库接口派生自己的接口并为所有继承的方法提供默认的空实现来避免讨论.
public interface MyInterface extends LibraryInterface {
@Override default public void event1() {
}
...
}
Run Code Online (Sandbox Code Playgroud)
或者你们两个都可以查看以下对我来说可疑的设计,这导致你们对接口中的默认方法的讨论:
即使监听器只对少数事件感兴趣,监听器 也必须在扩展接口时实现所有方法.
解决方案可能是简单地将大型界面拆分为许多较小的界面.
库开发人员对此是错误的(我什至不敢忽略恕我直言)。
过去在Java中引入了许多辅助(抽象和具体)类的原因之一就是缺少诸如默认接口方法之类的功能(例如,Swing中的适配器类非常类似于您所关注的问题) )。
如果不被滥用,在某些情况下,多重继承是可取的,众所周知,通过在Java中扩展“帮助”类,我们失去了从其他任何事物继承的能力。
实际上,在官方Java教程的 “与接口相比的抽象类”部分中提到了这一点:
如果以下任何一种情况适用于您的情况,请考虑使用接口:
- 您期望不相关的类将实现您的接口。例如,接口Comparable和Cloneable由许多不相关的类实现。
- 您想指定特定数据类型的行为,但不关心谁实现了它的行为。
- 您想利用类型的多重继承。
我认为第二点和第三点是您的用例的完美匹配。
| 归档时间: |
|
| 查看次数: |
1867 次 |
| 最近记录: |