14

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

在“最严格的意义上”,默认方法是一个倒退,因为它们允许你用代码“污染”你的接口。但它们提供了允许向后兼容的最优雅和实用的方法。它使 Oracle 可以更轻松地更新所有 Collections 类,并使您可以更轻松地为 Lambda 改造现有代码。

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

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

我确信 java 8 dev/designer 已经考虑过这一点,因为他们学得更多,我在这里遗漏了一些东西。有人可以在这里提供帮助,以便我们的开发人员也可以在这个重大变化中处于领先地位吗?

4

3 回答 3

13

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

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

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

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

于 2015-11-15T15:16:51.667 回答
11

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

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

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

于 2016-10-08T07:34:57.920 回答
1

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

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

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

于 2018-04-20T08:48:48.660 回答