请使用复选框选择_使用可选是可选的
請使用復選框選擇
在上周“收藏中的可選內容”的文章發表之后,我不禁要多講一些關于同一只野獸的事情。 更多細節。
最初由Google Guava引入并后來包含在Java 8軟件包中的Optionial類只是包裝可選對象的包裝器。 從包裝對象存在或包裝中沒有對象的意義上講,包裝對象是可選的,在這種情況下,包裝對象為空。 那里沒有太多魔法。 包裝代碼Optional類堅持認為,包裝的對象不是null 。 畢竟null為null ,不是對象。 對象永遠不會為null 。 僅對對象的引用可以為null 。
這些都是細微之處,細節; 但重要的細節。 畢竟,這些精細的細節是那些需要引入Optional的細節。 一般的Java程序員看不到這么細微的細節的重要性。 他們認為Optional與包裝對象本身的變量一樣好,前提是該變量也可以為null 。 在某種程度上,它們是正確的。 在自己的水平上。
這個級別表示好的代碼是可以理解的,就是這樣。 運行銀行,保險公司,起搏器和武器的大多數企業遺留代碼都是在此級別上制定的。 您無法做到這一點,只是希望自己能走運,而軟件錯誤不會在“炸彈”中爆炸時選擇您的房屋,銀行賬戶或遺體(如果使用醫療設備)。 您可以做的是理解問題并盡自己的一份力量來慢慢改善這種情況。 除非我們所有人在那之前被消滅,否則它需要幾代人的時間。
“代碼工作”和“可能理解”是軟件的最基本要求。 過去我們曾說過,如果軟件能夠運行,那就可以了,對于維護而言,只要有兩個能理解代碼的“人”就夠了:創建軟件的編碼者和創建編碼的上帝。 幸運的是,還有更高的水平。 (我的意思是高于編碼者。而不是高于上帝。)
下一個級別是“代碼工作”和“易于理解(不太難)”。 如果您必須調試代碼并需要確定某些故障的根本原因,這一點很重要。 “代碼工作”和“易于修改”再次成為新的階梯。 我看過容易理解的代碼。 代碼正在運行。 但是不同模塊之間的依賴性是如此復雜,就像花邊或傳統的意大利細面條一樣。 無論我在哪里想更改一些內容來修復錯誤,在其他地方程序都會開始失敗。 易于修改:該代碼不是。
下一個級別是“代碼工作”,“易于修改” 和 “很難創建錯誤的修改”。 這意味著該代碼提供了樣式和內部數據結構以及API,維護人員將在一定程度上遵循它們,并且將創建仍在工作,易于理解和修改的可修改工作代碼。 這是我們到達Optional的要點。
當方法返回Optional時 ,它表示它可能返回什么或什么都不返回。 Optional <Integer>可能返回一個Integer,但可能只返回一個空的Optional ,這意味著:沒有我可以返回的Integer 。 為什么比返回可能為null的Integer更好呢?
可選方法返回值
答案是,在返回Optional <Integer>的情況下,您不能:
integer = methodReturningIntegerOrNull(); otherInteger = integer +1;導致NPE。 你為什么這么做? 因為您忘記檢查了,JavaDoc在描述的末尾某處提到了這種可能性,當您進行編碼時,該可能性在鼠標懸停在窗口上方不可見。 如果是Optional <Integer> ,則必須執行以下操作:
optionalInteger = methodReturningOptionalInteger(); if( optionalInteger.isPresent() ){otherInteger = optionalInteger.get() +1;}仍然有機會寫:
optionalInteger = methodReturningOptionalInteger(); otherInteger = optionalInteger.get() +1;但是在那種情況下,你應該得到你所得到的。
可選幫助您創建更多代碼和更少文檔。 它提供了一種語義,以便以比可為空的值更難忽略的方式傳遞一些可選值。 它說:我不信任您正確處理null ,因此給您一個包裝的對象,因此您必須顯式處理可選性。
如果您認為您可以輕松回答問題
- 需要Optional <Something>作為方法參數
- 具有可選的私有字段。
是好主意。
可選方法參數
有優點也有缺點。 當論據說:
countFrom(Optional<Date> from, Date to);顯然,當缺少一個值時,可能缺少from值,并且應該有一些特殊的默認語義。 另一方面,調用方可以傳遞null以獲得特殊行為。 呼叫者不太可能會由于忽略可選性而錯誤地傳遞null 。 即使參數是Optional ,實際傳遞的參數仍可以為null ,我希望在這種情況下該方法將拋出NPE。 最后但并非最不重要的一點是引入Optional的另一個危險:調用方可以傳遞Optional,它包含一個非Date的對象。 泛型可以在Java中輕松繞過,草率的編碼器可能會傳遞錯誤的Optional 。 這意味著您必須在方法中實現斷言:
- 參數不為null,
- 參數是正確的類型。
還要記住,在方法返回值的情況下, Optional是說: 我不信任您正確處理null ,因此我為您提供了一個包裝對象,因此您必須顯式處理可選性 。 當您創建需要Optional作為參數的API時,此消息將是什么? 請不要相信我! 僅給我“ 可選”,因為即使我也不信任自己能夠正確處理null值。 很奇怪… 另一方面,我相信您不會傳遞null或錯誤的類型。
我認為:在這種情況下,使用Optional不會比為API提供適當的文檔提供更多的價值,并且不會強迫調用者表現得比它更好。 另一方面,您將額外的代碼放在自己的肩膀上。
給Optional提供您信任的代碼,從不信任您的代碼但不要求它的代碼中接受它! 相信自己!
私人可選字段
當您將本地私有字段聲明為Optional時,您將迫使該類的開發人員更加注意該字段的可選功能。 這樣做的代價是額外的包裝程序,可選的代碼處理中的額外混亂情況。 另一方面,沒有什么好處,因為您可以在檢查所有要考慮字段為空值的情況下獲得擴展單元測試的質量。 由于所有代碼都在當前負責全部代碼的開發人員手中,因此Optional沒有任何好處。 就像您不信任自己一樣。 這是一個嚴重的問題,需要比Optional Java類可以提供的更多和不同的對待。
功能編程中的可選
如果需要,可以使用Optional以功能性編程風格對Java進行編程,但是Java不是一種功能語言,而Optional和lambda以及僅功能性風格方法不能使它成為現實。 但這是以后要討論的話題。
翻譯自: https://www.javacodegeeks.com/2015/09/use-of-optional-is-optional.html
請使用復選框選擇
總結
以上是生活随笔為你收集整理的请使用复选框选择_使用可选是可选的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓使用记录怎么查(安卓使用记录)
- 下一篇: 老年机一键拨号设置图(老年机一键拨号设置