为什么接口默认方法?

问题描述 投票:0回答:4

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

从“最严格的意义上”来说,默认方法是一种倒退,因为 它们允许你用代码“污染”你的界面。但他们 提供最优雅实用的倒退方式 兼容性。它使 Oracle 更容易更新所有 集合类,供您改造现有代码 拉姆达。

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

为了克服这一问题,我们可以有一个类提供这些默认方法的实现,然后实现像 arraylist 等这样的类 已经扩展了。这样我们就可以同时满足 Java 基础知识,即可重用性和抽象性,即减少接口污染

我确信 java 8 开发者/设计师已经考虑过这一点,因为他们学得更多,而我在这里遗漏了一些东西。有人可以在这里提供帮助,以便我们开发人员也可以在这一重大变化中掌握它吗?

java java-8 default-method
4个回答
19
投票

在 Java 8 之前,

interfaces
只能有
abstract methods
。这些方法的实现必须在单独的类中提供。因此,如果要在
interface
中添加新方法,则必须在实现相同接口的类中提供其实现代码。

为了克服这个问题,Java 8 引入了

default methods
的概念,它允许接口具有可实现的方法,而不影响实现
interface
的类。

引入

default methods
是为了提供向后可比性,以便现有的
interfaces
可以使用 lambda 表达式,而无需实现实现类中的方法。
Default methods
也称为
defender methods
virtual extension methods


14
投票

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

您的建议仅适用于标准 JDK 类(因为它们通常扩展一些基类,例如

AbstractCollection
AbstractList
,可以添加新方法的实现)。

实现 JDK 接口的自定义类怎么样?例如,如果您有一个实现

List
但没有扩展某些 JDK
List
实现的类,您应该能够切换到 Java 8,而无需在类中实现新方法。

通过

default
接口中新方法的
List
实现,您无需触及自定义类。如果您对默认实现不满意,您可以稍后向这些方法添加自定义实现。


2
投票

如果需要向接口添加新方法,则使用现有接口的客户端将被破坏,因为类需要实现接口中的所有方法。

在这种情况下,可以使用默认和静态方法。这些方法可以有主体,客户端不需要实现它们,因此现有的实现无需任何更改即可工作。

例如,如果您想增强接口以添加接受 lambda 表达式的方法,则可以使用默认方法。


0
投票

这是场景:

  1. 我们构建了一个具有多个接口的应用程序。

  2. 我们向客户提供了这个应用程序,他们都开始使用它。

  3. 过了一段时间,我们决定更新这些界面。那时,如果我们添加任何新的抽象方法,这些方法必须由我们的客户实现。

  4. 在这种情况下,默认方法和静态方法起着至关重要的作用。通过添加新的默认或静态方法,我们的客户不需要实现它们。

Hope you got it.
© www.soinside.com 2019 - 2024. All rights reserved.