2014-01-06 52 views
4

我有一個小問題,關於Java接口添加新的方法,這是直接由許多類

實現的接口有沒有辦法添加到Java接口的新方法,而無需修改正在實施它的類。

條件是我不應該引入新的接口

+0

在Java 1.8中添加了Defender/Default方法,這將允許您向接口添加新方法和默認實現。 – samlewis

回答

8

有沒有辦法添加到Java接口的新方法,而無需修改正在實施它的類。

條件是,如果還包括不修改直接實現接口的很多類的情況,您已獲得我不應該引入新的接口

的不可能的任務

這就是爲什麼接口通常伴隨着抽象的Adapter類,它們以無所謂的方式實現所有的方法。然後,實現類擴展適配器而不是實現接口,因此如果您需要添加接口,則只需修改接口和適配器。

+2

+1除了最後一段。我認爲使用帶有無所事事實施的「適配器」是一個非常糟糕的想法。界面是合同。在沒有實際執行合約要做的工作的情況下實施它的方法會打破合同。 –

+0

然後,您將在'java.awt.event'中與所有適配器的作者爭論。隨意。 – EJP

+0

我同意,只有一個警告。適配器對於那些人們經常實現接口但只對一個或兩個回調感興趣的聽衆很有用。 –

2

你想要做的事情根本不可能。除非(正如在評論中指出的那樣)您使用Java 8.您可以使用Java 8。

Java 8引入了默認或防禦方法的概念,允許您向接口添加方法並在該方法中提供該方法的默認實現界面。

http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/

答案的其餘部分適用於Java的任何版本的前8:

的接口描述一個類的方法。如果向接口添加新方法,那麼實現接口的所有類都必須實現該方法。除非有一些碰運氣,否則你添加的方法已經存在於每一個實現類中,這是不可能的,不需要添加新的接口或者改變類。

如果你的接口是一個抽象類,那麼你可以添加一個存根方法,它什麼都不做,並且允許被覆蓋,但接口沒有可選方法的概念。

+2

直到java 1.8纔有根本的不可能:) – samlewis

+0

你記住了什麼java 8功能? –

+1

後衛/默認方法 – samlewis

相關問題