viewpager默认界面_使用默认方法的界面演变–第一部分:方法
viewpager默認(rèn)界面
幾周前,我們?cè)敿?xì)研究了默認(rèn)方法 -Java 8中引入的一項(xiàng)功能,該功能允許為接口方法提供實(shí)現(xiàn),即方法主體,從而定義接口中的行為。 引入此功能是為了實(shí)現(xiàn)接口演進(jìn) 。
在JDK的上下文中,這意味著在不破壞所有代碼的情況下向接口添加新方法。 但是,盡管Java本身非常致力于保持向后兼容性,但其他項(xiàng)目并不一定要做到這一點(diǎn)。 如果愿意,他們可以以讓客戶更改其代碼為代價(jià)來發(fā)展其接口。
在Java 8之前,這經(jīng)常涉及客戶端編譯錯(cuò)誤,因此可以避免更改,否則客戶端必須一次性遷移。 使用默認(rèn)方法,接口演變可以成為無錯(cuò)誤的過程,在此過程中,客戶可以在版本之間留出時(shí)間來逐步更新其代碼。 這大大增加了開發(fā)接口的可行性,并使其成為常規(guī)的庫(kù)開發(fā)工具。
讓我們看一下如何添加,替換和刪除接口方法。 以后的文章將探討替換整個(gè)接口的方法。
總覽
該帖子首先定義了一些術(shù)語,然后介紹了添加,替換和刪除接口方法的方法。 它是從更改庫(kù)中界面的開發(fā)人員的角度編寫的。
我覺得該主題不需要示例,因此我沒有編寫任何示例。 如果您不同意并希望看到一些內(nèi)容,請(qǐng)發(fā)表評(píng)論,并且-在時(shí)間允許的情況下-我會(huì)寫一些。
術(shù)語
接口具有實(shí)現(xiàn)和調(diào)用者 。 兩者都可以存在于庫(kù)中,在這種情況下,它們都稱為internal ,或者在客戶端代碼中稱為external 。 這總共增加了四種使用界面的類別。
根據(jù)接口的發(fā)展方式和存在的用途,必須采用不同的模式。 當(dāng)然,如果既不存在外部實(shí)現(xiàn)也不存在外部調(diào)用者,則這些都不是必需的,因此本文的其余部分假定這些情況中至少有一種確實(shí)存在。
接口演變–方法
因此,讓我們看看如何在不破壞客戶端代碼的情況下添加,替換或刪除接口方法。
通常可以通過執(zhí)行以下過程來實(shí)現(xiàn):
新版本該庫(kù)的新版本已發(fā)布,其中接口定義是過渡性的,并結(jié)合了舊的和新的所需輪廓。 默認(rèn)方法可確保所有外部實(shí)現(xiàn)和調(diào)用仍然有效,并且在更新時(shí)不會(huì)出現(xiàn)編譯錯(cuò)誤。
然后,客戶就有時(shí)間從舊大綱過渡到新大綱。 同樣,默認(rèn)方法可確保適應(yīng)的外部實(shí)現(xiàn)和調(diào)用有效,并且可以進(jìn)行更改而不會(huì)產(chǎn)生編譯錯(cuò)誤。
在新版本中,該庫(kù)刪除了舊輪廓的殘差。 鑒于客戶端明智地利用了自己的時(shí)間并進(jìn)行了必要的更改,因此發(fā)布新版本不會(huì)導(dǎo)致編譯錯(cuò)誤。
這個(gè)過程使客戶能夠按自己的時(shí)間表平穩(wěn)地更新其代碼,這使得接口的開發(fā)比以前更加可行。
Johanna Pung在CC-BY-SA 3.0下為Wikimedia Deutschland 發(fā)布 。
在遵循以下詳細(xì)步驟時(shí),請(qǐng)確保檢查何時(shí)更新了內(nèi)部和外部實(shí)現(xiàn)以及何時(shí)允許內(nèi)部和外部調(diào)用者使用所涉及的方法。 確保在您自己的代碼中遵循此過程,并為您的客戶正確記錄下來,以便他們知道何時(shí)執(zhí)行操作。 Javadoc標(biāo)簽@Deprecated和@apiNote是實(shí)現(xiàn)此目的的好方法。
通常,不必按該順序執(zhí)行過渡內(nèi)的步驟。 如果是,則明確指出。
如果您向客戶提供可以在其界面實(shí)現(xiàn)上運(yùn)行的測(cè)試,則這些步驟中包含測(cè)試。
加
僅當(dāng)存在外部接口實(shí)現(xiàn)時(shí)才需要此過程。 由于該方法是新方法,因此當(dāng)然尚未調(diào)用,因此可以忽略這種情況。 區(qū)分是否可以提供合理的默認(rèn)實(shí)現(xiàn)是有意義的。
存在合理的默認(rèn)實(shí)現(xiàn)
新版本- 為新方法定義測(cè)試
- 使用默認(rèn)實(shí)現(xiàn)(通過測(cè)試)添加方法
- 內(nèi)部呼叫者可以使用該方法
- 內(nèi)部實(shí)現(xiàn)可以在必要時(shí)覆蓋該方法
- 外部呼叫者可以使用該方法
- 外部實(shí)現(xiàn)可以在必要時(shí)覆蓋該方法
無需執(zhí)行任何操作,也不需要任何新版本。 這就是Java 8中添加的許多新的默認(rèn)方法所發(fā)生的事情。
不存在合理的默認(rèn)實(shí)現(xiàn)
新版本- 為新方法定義測(cè)試; 這些必須接受UnupportedOperationExceptions
- 添加方法:
- 包括一個(gè)引發(fā)UnupportedOperationException的默認(rèn)實(shí)現(xiàn)(通過測(cè)試)
- @apiNote注釋文檔,默認(rèn)實(shí)現(xiàn)將最終被刪除
- 在所有內(nèi)部實(shí)現(xiàn)中覆蓋該方法
必須按該順序執(zhí)行以下步驟:
- 外部實(shí)現(xiàn)必須重寫該方法
- 外部呼叫者可以使用該方法
- 測(cè)試不再接受UnupportedOperationExceptions
- 使方法抽象:
- 刪除默認(rèn)實(shí)現(xiàn)
- 刪除@apiNote注釋
- 內(nèi)部呼叫者可以使用該方法
勉強(qiáng)一致的默認(rèn)實(shí)現(xiàn)允許外部實(shí)現(xiàn)逐漸更新。 請(qǐng)注意,在實(shí)際在內(nèi)部或外部調(diào)用新方法之前,將更新所有實(shí)現(xiàn)。 因此,永遠(yuǎn)不會(huì)發(fā)生UnupportedOperationException。
更換
在這種情況下,一種方法將被另一種方法替代。 這包括一種方法更改其簽名(例如,其名稱或參數(shù)數(shù)量)的情況,在這種情況下,新版本可以看作是替換舊版本。
當(dāng)存在外部實(shí)現(xiàn)或外部調(diào)用者時(shí),必須應(yīng)用此模式。 僅在兩種方法在功能上等效時(shí)才起作用。 否則,就是添加一個(gè)功能并刪除另一個(gè)功能的情況。
新版本- 為新方法定義測(cè)試
- 添加新方法:
- 包括調(diào)用舊方法的默認(rèn)實(shí)現(xiàn)
- @apiNote注釋文檔,默認(rèn)實(shí)現(xiàn)將最終被刪除
- 棄用舊方法:
- 包括調(diào)用新方法的默認(rèn)實(shí)現(xiàn)(旨在進(jìn)行循環(huán)調(diào)用;如果存在默認(rèn)實(shí)現(xiàn),則可以保留)
- @apiNote注釋文檔,默認(rèn)實(shí)現(xiàn)將最終被刪除
- @Deprecation評(píng)論文檔說明將使用新方法
- 內(nèi)部實(shí)現(xiàn)會(huì)覆蓋新方法,而不是舊方法
- 內(nèi)部調(diào)用者使用新方法代替舊方法
- 外部實(shí)現(xiàn)會(huì)覆蓋新方法,而不是舊方法
- 外部呼叫者使用新方法代替舊方法
- 使新方法抽象:
- 刪除默認(rèn)實(shí)現(xiàn)
- 刪除@apiNote注釋
- 刪除舊方法
盡管循環(huán)調(diào)用看起來很有趣,但它們確保實(shí)現(xiàn)哪種方法都無關(guān)緊要。 但是,由于這兩種變體都有默認(rèn)實(shí)現(xiàn),因此,如果兩種實(shí)現(xiàn)均未實(shí)現(xiàn),則編譯器不會(huì)產(chǎn)生錯(cuò)誤。 不幸的是,這會(huì)產(chǎn)生無限循環(huán),因此請(qǐng)確保將其指出給客戶。 如果您為他們的實(shí)現(xiàn)提供測(cè)試,或者他們編寫了自己的實(shí)現(xiàn),則他們會(huì)立即意識(shí)到這一點(diǎn)。
去掉
刪除方法時(shí),根據(jù)是否存在外部實(shí)現(xiàn),可以應(yīng)用不同的模式。
存在外部實(shí)現(xiàn)
新版本- 方法的測(cè)試必須接受UnupportedOperationExceptions
- 棄用該方法:
- 包括一個(gè)引發(fā)UnupportedOperationException的默認(rèn)實(shí)現(xiàn)(通過更新的測(cè)試)
- @Deprecation注釋文檔表明該方法最終將被刪除
- @apiNote注釋文檔說明默認(rèn)實(shí)現(xiàn)僅存在于逐步淘汰方法中
- 內(nèi)部呼叫者停止使用該方法
必須按該順序執(zhí)行以下步驟:
- 外部呼叫者停止使用該方法
- 該方法的外部實(shí)現(xiàn)已刪除
- 刪除方法
請(qǐng)注意,只有在不存在對(duì)該方法的更多調(diào)用之后,才刪除內(nèi)部和外部實(shí)現(xiàn)。 因此,永遠(yuǎn)不會(huì)發(fā)生UnupportedOperationException。
外部實(shí)現(xiàn)不存在
在這種情況下,定期棄用就足夠了。 僅出于完整性考慮而列出了這種情況。
新版本- 用@Depreated棄用該方法
- 內(nèi)部呼叫者停止使用該方法
- 外部呼叫者停止呼叫方法
- 刪除方法
反射
我們已經(jīng)看到了如何通過添加,替換和刪除方法來實(shí)現(xiàn)界面演化:新的界面版本結(jié)合了舊的和新的輪廓,客戶端從前者過渡到后者,而最終版本則消除了舊輪廓的殘留物。 所涉及方法的默認(rèn)實(shí)現(xiàn)確保客戶端代碼的舊版本和新版本都能正確編譯和運(yùn)行。
翻譯自: https://www.javacodegeeks.com/2015/03/interface-evolution-with-default-methods-part-i-methods.html
viewpager默認(rèn)界面
總結(jié)
以上是生活随笔為你收集整理的viewpager默认界面_使用默认方法的界面演变–第一部分:方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php cdi_CDI和EJB:在事务成
- 下一篇: jpa和hibernate_JPA和Hi