2015-11-15 91 views
4

学习java 8的默认方法。 这link像互联网上的任何其他资源说为什么接口默认方法?

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

我的理解是Java 8开发/设计者在接口中提供的默认方法,使得所有执行类没有不必要地 倍率相同的行为,因此,提供向后兼容性。例如: - 如果ForEach方法不是默认方法,则每个实现类的集合都必须实现它。同意。

为了克服这一点,我们可以有一个类提供这些默认方法的实现,然后实现像arraylist等类可以 已经扩展了。通过这种方式,我们可以确定java的基本原则,即可重用性和抽象性,即保持接口污染更少

我相信java 8 dev/designer已经考虑过了,因为它们更加了解,我在这里错过了一些东西。有人可以在这里帮助,以便我们的开发人员也可以在这个重大变化之上做到最重要?

+0

[Java 8中默认或Defender方法的用途]的可能重复(http://stackoverflow.com/questions/19998309/purpose-of-default-or-defender-methods-in-java-8) – roottraveller

回答

5

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

你的建议只会工作标准JDK类(因为他们通常继承一些基类,如AbstractCollectionAbstractList,是可以添加的新方法的实现)。

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

使用defaultList接口中实现新方法时,您不必触摸自定义类。如果您对默认实现不满意,可以稍后向这些方法添加自定义实现。

+0

In这种情况下,自定义类也可以扩展实现forEach实现的泛型类。但是,如果该类已经扩展某些类,我的建议将无法正常工作,但再次限制。 –

+0

'在List接口中使用新方法的默认实现,您不必触摸您的自定义类。如果您对默认实现不满意,您可以稍后向这些方法添加自定义实现。“同意。但是我们在某种意义上向后退一步,因为我们以某种方式在这里稀释抽象 –

+4

@MSach即使它没有扩展某个类,也将被迫改变它的实现(即使只是添加一个'extends someClass'子句)。 – Eran

0

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

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

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

相关问题