为什么使用接口默认方法?

2022-09-04 00:55:50

学习java 8种默认方法。这个链接像互联网上的任何其他资源一样说

在“最严格的意义上”,Default方法是倒退的,因为它们允许您用代码“污染”您的接口。但它们提供了最优雅和最实用的方式来实现向后兼容性。它使 Oracle 能够更轻松地更新所有集合类,并让您更轻松地为 Lambda 改造现有代码。

我的理解是,java 8开发/设计人员在接口中提供了默认方法,因此所有实现类都不必不必要地覆盖相同的行为,从而提供向后兼容性。例如 :- 如果 ForEach 方法不是默认方法,则每个集合实现类都必须实现它。同意。

为了克服这个问题,我们可以有一个类提供这些默认方法的实现,然后实现像arraylist等类可以扩展它。通过这种方式,我们可以统计Java的基础知识,即可重用性和抽象性,即保持较少的接口污染。

我相信java 8开发人员/设计师已经考虑过这一点,因为他们学识渊博,我在这里错过了一些东西。有人可以在这里提供帮助,以便我们开发人员也可以作为这一重大变化来掌握它吗?


答案 1

为了克服这个问题,我们可以有一个类提供这些默认方法的实现,然后实现像arraylist等类可以扩展它。

您的建议仅适用于标准 JDK 类(因为它们通常会扩展一些基类,例如 and ,如果可以添加新方法的实现)。AbstractCollectionAbstractList

实现 JDK 接口的自定义类呢?例如,如果你有一个实现但不扩展某些 JDK 实现的类,那么你应该能够切换到 Java 8,而不必在类中实现新方法。ListList

通过在接口中实现新方法,您不必接触自定义类。如果默认实现不满意,则可以稍后向这些方法添加自定义实现。defaultList


答案 2

在Java 8之前,可能只有.这些方法的实现必须在单独的类中提供。因此,如果要在 中添加新方法,则必须在实现相同接口的类中提供其实现代码。interfacesabstract methodsinterface

为了克服这个问题,Java 8 引入了一个概念,它允许接口具有实现的方法,而不会影响实现 .default methodsinterface

引入 它们是为了提供向后可比性,以便现有对象可以使用 lambda 表达式,而无需在实现类中实现方法。 也称为 或 。default methodsinterfacesDefault methodsdefender methodsvirtual extension methods


推荐