2015-11-15 90 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

相關問題