默认方法一种扩展旧代码的方法
如您所知,Java的新版本于2014年3月18日發(fā)布,我將介紹一系列文章來演示其新功能,也許在某些方面,我將談?wù)撐业南敕ê团u(píng)。
我認(rèn)為重要的第一個(gè)功能是“默認(rèn)方法”,在所有Java語言的先前版本中,接口只能包含方法定義(聲明)而不是方法實(shí)現(xiàn)(方法體),但是在Java 8中,接口中增加了一個(gè)新功能,使您能夠在接口中聲明方法及其實(shí)現(xiàn)。
假設(shè)您可以使用以下新功能創(chuàng)建一個(gè)界面:
public interface Dog {void bark();default void bite() {System.out.println("Biting Biting Biting");} }public class Husky implements Dog {@Overridepublic void bark() {System.out.println("barking");}public static void main(String... args){Dog dog = new Husky();dog.bite();dog.bark();} }這是完全自我解釋的,您可以將行為添加到接口中,并且所有已實(shí)現(xiàn)的類都將這種行為作為方法的默認(rèn)實(shí)現(xiàn),因此不會(huì)被迫實(shí)現(xiàn)默認(rèn)方法。
默認(rèn)方法的原因
在之前的一篇文章中,我們對(duì)Open Close Principal進(jìn)行了介紹,就像在這個(gè)Principal類中的評(píng)論應(yīng)該關(guān)閉才能進(jìn)行修改而可以擴(kuò)展一樣。 我認(rèn)為默認(rèn)方法并不遵循該原則,但是有些地方也許我們沒有任何解決方案來擴(kuò)展我們的舊代碼。
例如,在Java 8中,語言中增加了一個(gè)新功能,可以在集合上使用lambda,可以使用此方法的一種方法是調(diào)用Collection接口的stream方法,如果這只是一個(gè)方法聲明,則說明實(shí)現(xiàn)了Collection的所有書面代碼會(huì)休息的。
有時(shí)候,對(duì)我來說,需要擴(kuò)展我的界面,但是由于許多其他客戶端正在使用界面,我不得不找到另一種解決方案,不幸的是,在大多數(shù)情況下,這是一種麻煩的方式。
有關(guān)默認(rèn)方法的幾點(diǎn)
當(dāng)您要使用默認(rèn)方法或要使用使用默認(rèn)方法的代碼時(shí),應(yīng)了解一些要點(diǎn)。
- 擴(kuò)展包含默認(rèn)方法的接口:
當(dāng)您想使用默認(rèn)方法擴(kuò)展或?qū)崿F(xiàn)接口時(shí),關(guān)于默認(rèn)方法有三種選擇。- 您可以使用它們的默認(rèn)實(shí)現(xiàn),而忽略以重新定義它們。
- 您可以重新聲明它,因此它將是一種抽象方法。
- 您可以通過重新定義它來覆蓋它。
- 使用默認(rèn)方法的多重繼承:使用默認(rèn)方法,您可以擁有具有許多接口的mixin行為的類,但是您應(yīng)該注意一個(gè)重要的點(diǎn)。
如果擴(kuò)展接口具有公共方法簽名,則您 將面臨編譯時(shí)錯(cuò)誤 ,因?yàn)橥环椒ê灻膬蓚€(gè)實(shí)現(xiàn)之間存在歧義,在這種情況下,您將需要重寫方法并通過自己的代碼來實(shí)現(xiàn)或選擇默認(rèn)方法之一。
- 擴(kuò)展包含默認(rèn)方法的接口:
翻譯自: https://www.javacodegeeks.com/2014/03/default-methods-an-approach-to-extend-legacy-code.html
總結(jié)
以上是生活随笔為你收集整理的默认方法一种扩展旧代码的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓遥控电视app(安卓遥控电视)
- 下一篇: JDK 8时代的抽象类与接口