从方法返回Java 8的可选项时的注意事项
Java 8引入的Optional類一直是該語言版本引入的最具爭議的功能之一。 盡管我喜歡這個新的Java類的東西比不喜歡的東西多,但在Java方法中將其用作return類型時,需要考慮一些事情。 我將在本文中討論其中的一些問題,但不會討論有關(guān)是否應(yīng)該將Optional限制為用作返回類型的爭論 。 我還假定Optional僅在期望在某些情況下該方法不應(yīng)該返回任何值時才用作返回類型。 最后,這些觀察結(jié)果適用于其他類型,并且也直接在Java中使用null ,但是Optional強調(diào)并具體說明了這些觀察結(jié)果。
單一收益與多重收益
在一般的軟件開發(fā)社區(qū)和Java開發(fā)社區(qū)中,有一段時間一直在爭論(“ 宗教戰(zhàn)爭 ”)關(guān)于是否應(yīng)該編寫方法僅return一次(在本次討論中不計入拋出異常 )的爭論。 一方面, Yegor Bugayenko認為“ 許多返回語句在OOP中不是一個好主意 ”, Tom Dalling認為“ 從函數(shù)中獲得一個退出點(返回)是一件好事 ”,而且許多人認為經(jīng)常有多個return語句表示需要重構(gòu)該方法 。 另一方面, 布魯斯·埃克爾(Bruce Eckel)認為 ,多個return語句可使代碼更“清晰”, 泰勒·高鐵 ( Taylor Gautier)認為,“ 格言(Maxim) ”“一種方法應(yīng)該只有一個出口點”“不會再錯了”, 彼得Ritchie認為, 嚴格遵守單出口,如今會導致“面向?qū)ο蟮恼Z言”中的“可讀性較低”的代碼,而Mark Levison概述了“ 一些我不喜歡單出口論點的原因 ?!?
Nicolai Parlog在“ 多重返回語句 ”一文中 ,介紹了方法僅返回一次的想法的歷史以及需要考慮的事項。 他包括“多重收益表的情況”一節(jié),其中概述了“一種方法可以從多個收益表中獲利的幾種情況?!?我最好的猜測是,許多開發(fā)商覺得我做的方式,這是“這取決于”決定一個特定的方法是否應(yīng)該只有一個的時候return陳述或應(yīng)該有一個以上的return聲明。
當我開始更頻繁地將Java 8的Optional用于我的方法的返回類型時,我發(fā)現(xiàn)在確定是從方法中返回一次還是多次時,還需要考慮使用Optional作為返回類型。
在聲明Java方法返回Optional ,重要的是要充分理解這并不妨礙編寫此方法的開發(fā)人員返回null 。 返回的Optional是引用類型,并且與任何引用類型一樣,可以為null 。 至關(guān)重要的是,開發(fā)人員編寫返回Optional的方法時, 切勿讓該方法返回null [通常應(yīng)返回Optional.empty()來代替]。 我將用兩句話來重申這一點:
- 第三版 , 有效Java中項目#55中突出顯示的句子:“ 切勿從Optional -returning方法返回空值。 “
- 斯圖爾特·馬克(Stuart Marks)使用Optional 的#1規(guī)則 ,“永遠,永遠不要對Optional變量或返回值使用null?!?
一個方法中針對多個return語句的參數(shù)之一是,它使得識別每種情況下返回的內(nèi)容變得更加困難(查找所有可能的返回方案)。 使用Optional作為返回類型的一個具體示例說明了這一點。 一個人要確保在某些情況下自己的方法不會返回null ,而在其他情況下則要確保返回Optional實例。 編譯器當然不會在每種情況下返回哪個值。
解決此問題的一種方法是只從方法中返回一次,然后開發(fā)人員編寫代碼,而開發(fā)人員查看代碼則可以輕松地確保不返回null 。 這些開發(fā)人員將只需要查找Optional.of(T)調(diào)用, Optional.ofNullable(T)調(diào)用或Optional.empty()調(diào)用。
在方法中使用基礎(chǔ)數(shù)據(jù)類型的局部變量
當在返回點實例化Optional時,這種避免意外返回null而不是空Optional最有效。 換句話說,我發(fā)現(xiàn)最好在整個方法中使用Optional包裝的類型,然后在最后可能的時候?qū)⑵浞旁贠ptional中。 下一個代碼清單提供了這些荒謬的瑣碎示例。
聲明最終以可選方式返回的局部變量的示例
/*** Provides the middle name if it exists.** @return Middle name if it exists or empty if it doesn't exist.*/ public Optional<String> determineMiddleName1() {String middleName;// Do whatever logic is necessaryreturn Optional.ofNullable(middleName); }/*** Provides the middle name if it exists.** @return Middle name if it exists or empty if it doesn't exist.*/ public Optional<String> determineMiddleName2() {Optional<String> middleName;// Do whatever logic is necessaryreturn middleName; }在上面的代碼中, determineMiddleName 1 ()方法與基礎(chǔ)類型的局部變量一起使用。 通常,這比Optional更容易設(shè)置/填充,并且在末尾使用Optional.isNullable()可確保即使是null MiddleName也將作為“空”的Optional而不是null 。
上面的代碼中的defineMiddleName determineMiddleName 2 ()方法聲明其局部變量,該局部變量最終將作為Optional<String>返回,然后在該方法末尾返回該引用。
避免局部變量的“默認”初始化
在上面編寫方法defineMiddleName determineMiddleName 2 () ,編譯器將幫助確保將局部變量“ middleName”設(shè)置為某物(即使該“ something”為null ),但開發(fā)人員已選擇將其“ middleName”變量初始化為null開頭,編譯器將不會有任何問題。 如果由于某種原因需要初始化局部變量,最好將其初始化為Optional.empty()而不是null 。 如果開發(fā)人員選擇使用Optional.empty()初始化該變量,那么第二個示例仍然有可能在該方法的后面將本地變量“重置”為null 。
該討論使我對Java中將Optional用作方法返回類型有三點看法。
這些觀察可以合并。 例如,當確定某個方法應(yīng)具有多個返回(例如實現(xiàn)guard子句 )時,可以在每次返回時返回適當?shù)姆莕ull Optional引用,并且直到需要時才初始化局部變量(通過警衛(wèi))。 下一個可笑的例子說明了這一點。
避免使用多個返回語句返回空值的示例
public Optional<String> getGuardedData(final String input) {if (input == null){return Optional.empty();}String data;// Do whatever logic is necessaryreturn Optional.ofNullable(data); }我發(fā)現(xiàn)Optional類在正確用作方法返回類型時,由于它的流利程度更高,可以使客戶端的代碼更具可讀性。 但是,要獲得其最大值,必須遵循紀律應(yīng)用Optional ,以便代碼的客戶可以期望返回的Optional永遠不會為null 。 這篇文章研究了一些注意事項,可以幫助確保從不會將自已聲明為return Optional的方法返回null 。 沒有信任,該方法不會返回null ,使用Optional的返回類型只能使事情變得更糟,因為它迫使客戶端的非第一次檢查null Optional調(diào)用上的方法之一,之前Optional 。 這使得調(diào)用代碼不太流暢 。
翻譯自: https://www.javacodegeeks.com/2018/01/considerations-returning-java-8s-optional-method.html
總結(jié)
以上是生活随笔為你收集整理的从方法返回Java 8的可选项时的注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓typec和苹果typec能通用吗(
- 下一篇: java核心面试_Java核心面试问题