2017-05-03 44 views
0

在瀏覽彈簧安全模塊時,我遇到了Principal Interface類中的這段代碼。我的理解是接口不具體實現任何東西。定義具體方法的接口 - 在什麼情況下允許?

接口內的下面一段代碼是什麼原因?

public interface Principal {  
//other method definitions 

    public default boolean implies(Subject subject) { 
    if (subject == null) 
     return false; 
    return subject.getPrincipals().contains(this); 
    } 
} 
+0

的Java 8中添加以添加接口的默認方法的能力。 –

+0

無法找到合適的副本,但[此處](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)介紹了接口中的默認方法 –

回答

2

那些被稱爲默認方法;並與Java8一起引入。

引述甲骨文tutorial

默認方法讓你新的功能添加到您的庫的接口,保證與舊版本的這些接口編寫的代碼的二進制兼容性。

含義:從java8開始,我們實際上可以將行爲添加到接口中。這個想法是爲了讓現有接口更容易到增強 - 不提供Java的「通用」mixin/trait概念。

換句話說:根據後面的Java的人,主要原因default是需要提高很多現有的集合接口,以支持新的範例。

還值得指出的是,Java8接口還可以讓靜態方法:

除了默認的方法,你可以在接口定義靜態方法。 (靜態方法是一種與定義它的類相關的方法,而不是任何對象,類的每個實例都共享其靜態方法)。

1

這是接口的默認方法,自Java 8起可用。 這是一項功能,允許開發人員在不破壞現有實現的情況下向接口添加新方法。它提供了靈活性來允許接口定義實現,在具體類無法爲該方法提供實現的情況下,它將默認使用。

重構框架中的現有接口或者甚至從JDK的 中很複雜。修改一個接口會中斷所有類, 擴展了接口,這意味着添加任何新方法可能會破壞數百萬行代碼。因此,默認方法引入了作爲以兼容的方式向後擴展接口的機制。

另一個潛在的用法是從接口調用其他方法,就像在forEach選項中調用另一個只接受一個元素的方法。

我個人認爲,應儘可能少地使用默認方法,不要包含任何業務邏輯。它主要用於保持舊版界面(10年以上)兼容復古。

更多細節:https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html https://dzone.com/articles/interface-default-methods-java

相關問題