为什么接口默认方法?

时间:2015-11-15 15:12:48

标签: java java-8 default-method

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

  

在“最严格的意义上”,默认方法是向后退一步因为   它们允许您使用代码“污染”您的接口。但是他们   提供最优雅和实用的方式允许倒退   兼容性。它使Oracle更容易更新所有内容   集合类,并为您改进现有代码   LAMBDA。

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

为了克服这个问题,我们可以让一个类提供这些默认方法的实现,然后实现类似arraylist等的类 扩展了那个。通过这种方式,我们可以对java基本原理进行统计,即可重用性和抽象性,即保持界面污染较少

我确信java 8开发/设计师已经考虑过这个问题,因为他们学到的东西更多,我在这里缺少一些东西。有人可以帮助我们,这样我们的开发人员也可以作为这一重大变化的最佳人选吗?

3 个答案:

答案 0 :(得分:7)

  

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

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

实现JDK接口的自定义类怎么样?例如,如果您有一个实现List但没有扩展某些JDK List实现的类,那么您应该能够切换到Java 8而无需在您的类中实现新方法

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

答案 1 :(得分:4)

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

为了解决这个问题,Java 8引入了default methods的概念,它允许接口使用实现方法,而不会影响实现interface的类。

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

答案 2 :(得分:0)

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

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

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