我的项目中使用了某个库。这个库有一个接口,它有大约15种方法。
此接口的目的是可以订阅库中生成的某些事件。应用程序中的侦听器类可以实现此接口,并将自身注册为库中的侦听器以接收事件。
此界面中的所有方法实际上都是事件。可以有听众只需要从界面中的许多事件中仅接收一个或两个事件。即使监听器只对少数事件感兴趣,监听器也必须在扩展接口时实现所有方法。
所以我要求这个库的开发人员在界面中的方法中添加空的默认实现。
但是库开发人员拒绝添加默认实现,声明它会违反java最佳实践,并且在接口方法中使用默认实现会违背接口的目的。
但是,据我所知,此接口中的方法没有指定此接口的实现者应该具有的某些操作。此接口中的方法相当定义了实现者可能感兴趣的事件。因此,我看不出没有添加默认实现的明确原因。
那么,在这个界面中添加默认实现会破坏java最佳实践吗?
答案 0 :(得分:6)
但是库开发人员拒绝添加默认实现, 声明它会违反java最佳做法并使用默认值 接口方法中的实现违背了目的 接口
在引入默认接口方法之前,此参数有效。 现在你的同事必须争辩说Java 8的JLS变换了接口,而JDK现在包含了违背接口目的的类。这仍然是一个可行的极端立场,但却毫无结果。
您可以通过从库接口派生自己的接口并为所有继承的方法提供默认的空实现来避免讨论。
public interface MyInterface extends LibraryInterface {
@Override default public void event1() {
}
...
}
或者你们两个都可以查看下面的设计,这个设计对我来说很可疑,这导致你们讨论接口中的默认方法:
即使听众只是感兴趣在少数事件,听众 扩展接口时,必须实现所有方法。
解决方案可能是简单地将大型界面拆分为许多较小的界面。
答案 1 :(得分:4)
图书馆开发人员对此有误(我甚至不敢省略恕我直言)。
过去引入Java中的许多帮助程序(包括抽象和具体)类的原因之一就是缺少默认接口方法等功能(例如Swing中的适配器类非常类似于您关注的问题)正在询问)。
如果没有被滥用,在某些情况下需要多重继承,而且众所周知,通过扩展“帮助者”来实现多重继承。在Java中,我们正在失去从其他任何东西继承的能力。
实际上,官方Java tutorial中提到了这一点,"抽象类与接口相比":
如果这些陈述中的任何一个适用于您的,请考虑使用接口 情况:
- 您希望不相关的类会实现您的界面。例如,实现了Comparable和Cloneable接口 许多不相关的课程。
- 您希望指定特定数据类型的行为,但不关心谁实现其行为。
- 您希望利用类型的多重继承。
我认为第二点和第三点是您用例的完美匹配。
答案 2 :(得分:1)
由于默认方法使我们能够在不破坏实现该接口的类的情况下向接口添加新功能,因此它绝对不是一个好的做法,因为它结合了接口和抽象类的优点,但由于这不是一个选项,我会强烈建议您提供自己的骨架实现类,因为这种“方法”在java中的集合框架中使用,这只是我的拙见。