java api设计规范
Java 8在接口中引入了默认方法。 这篇文章描述了它们是什么,以及它们如何改变API的设计。
名义设计
以前,在Java中,接口只能具有合同 -没有实现的方法签名。
为了添加一些实现,需要一个类,无论是否抽象 。
因此,传统的API设计遵循以下层次结构:
- 根接口定义合同
- 中级类实现常见行为, 即
Bar
- 如有必要,层次结构中的类将覆盖此行为, 例如
Corge
工作中的扳手
这是完美的,直到API设计人员无法访问的类可以实现该接口为止。 以下层次结构描述了Java Collections API的List
部分,以及一个附加的自定义类:
现在,让我们在List
接口中介绍sort()
方法。 只有类,即 AbstractList
和MyList
实际上可以实现此方法。
显然,即使在两个类中都强制执行相同的sort()
实现是不可能的。 List
直接实现必须复制( yuck! ) AbstractList
的sort()
。
为了消除重复和使设计干燥,Java API设计人员已将sort()
方法从List
移至仅使用static
方法的不相关类。
这解决了常见的代码问题,因为现在只有一种方法负责排序 。
另一方面, static
方法不是面向对象的。 更糟糕的是,代码中从 List
到Collections
之间没有关系(尽管存在相反的关系)。 因此,如果不了解Collections
类及其功能,就无法了解它。
抢救的默认方法
现在,想象一下是否有可能在接口方法中实现代码。 sort()
方法可以在List
接口中实现。 上面的类图将如下所示:
这样可以解决上述问题。 默认情况下,将通过继承为每个列表实现提供sort()
方法。
这正是使用默认方法的原因。 不多不少。
对于好奇的读者,Collections.sort()实现已重写为委托给默认方法://没有泛型以提高可读性public class Collections {public static void sort(List list){list.sort(null); }}
结论
如果最终不得不在多个类中复制代码,而不是将其分解为单个公共接口,那么默认方法是比帮助器类更为优雅的解决方案。
java api设计规范