摘要:在之前加入的三個方法并不支持在對象為空時返回一個默認值。取而代之的是,這三個方法會拋出。中新加入的兩個方法則會在傳入值為時返回一個默認值。還加了一個有相同功能的方法。當傳入的第一個參數不是時,該方法將不會被調用。
前言
本篇文章重點討論JDK9中添加的靜態方法,requireNonNullElse和requireNonNullElseGet。
正文JDK9在Object類中新添加了兩個靜態方法,requreNonNullElse(T, T)和 requireNonNullElseGet(T obj,Supplier extends T> supplier)。這兩個方法簡化了判斷對象是否為空(null),如果是空的則返回一個默認值。因此,這兩個方法和早期JDK版本中引入的方法requireNonNull(T),requireNonNull(T,String)和requireNonNull(T,Supplier
在JDK9之前加入的三個方法并不支持在對象為空時返回一個默認值。取而代之的是,這三個方法會拋出NullPointerException。JDK9中新加入的兩個方法則會在傳入值為null時返回一個默認值。
Objects.requireNonNullElse(T,T)是新加入的兩個方法中,最直接明了的定義返回值的方法。下面的這段代碼展示了如何使用該方法:
/** * Provide instance of {@code Instant} that corresponds to * the provided instance of {@code Date}. * * @param inputDate Instance of {@code Date} for which * corresponding instance of {@code Instant} is desired; * if this is {@code null}, an {@code Instant} representing * "now" will be returned. * @return Instance of {@code Instant} extracted from provided * {@Date} that will instead represent "now" if provided * {@code Date} is {@code null}. */ public Instant convertDateToInstantWithNowDefault(final Date inputDate) { final Date dateToConvert = Objects.requireNonNullElse(inputDate, new Date()); return dateToConvert.toInstant(); }
在上面的例子中,如果提供的參數對象inputDate為null的話,默認值now(new Date()構造函數返回當前的時間)將會作為默認值返回。
JDK9還加了一個有相同功能的Objects.requireNonNullElseGet(T,Supplier extends T>)方法。這個方法和上一個方法的區別是,它接收一個Supplier對象來提供默認值,而不是直接返回一個同類型的對象作為默認值。
Modern Java Recipes, Ken Kousen 這本書中寫道:Supplier S的基本用途之一就是支持延遲執行。在討論了如何使用JDK中的Supplier之后,他還補充了:可以在代碼中使用延遲執行,從而確保只有在時機合適時才會從Supplier處獲取值。
下面展示了該方法的使用:
/** * Provide instance of {@code Instant} that corresponds to * the provided instance of {@code Date}. * * @param inputDate Instance of {@code Date} for which * corresponding instance of {@code Instant} is desired; * if this is {@code null}, an {@code Instant} based on * a complicated date calculation will be returned. * @return Instance of {@code Instant} extracted from provided * {@Date} that will instead represent a calculated date if * provided {@code Date} is {@code null}. */ public Instant convertDateToInstantWithCalculatedDefault(final Date inputDate) { final Date dateToConvert = Objects.requireNonNullElseGet(inputDate, () -> calculateDate()); return dateToConvert.toInstant(); }
當獲取默認值的過程預計會運行較常時間時,傳入一個Supplier作為獲取默認值的方法會很有優勢。這時,只有當傳入的第一個參數為null時才會執行該方法。當傳入的第一個參數不是null時,該方法將不會被調用。
本文中提到的兩個方法簡化了判斷一個參數是否為null并在為null時返回一個默認值的過程。它們最長用來實現防御性編程,當然也有其他的應用場景。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68490.html
摘要:前言這周我準備介紹一個有趣的但是很少使用的方法按照合約編程,又稱為合約編程,是一種軟件設計的方法。這些規則被稱為合約,可以比擬為商業合同中的條件和義務。通過將檢查和異常拋出指令包裝到方法中,人們可以很容易地實現合約式編程。 前言 這周我準備介紹一個有趣的但是很少使用的方法 按照合約編程,又稱為合約編程,是一種軟件設計的方法。它規定了軟件設計師應該為軟件組件定義正式,精確和可驗證的接口規...
摘要:本文簡介類概覽類構造器總結類構造方法類使用舉例類概覽是一個實現了接口,并且鍵為型的哈希表。中的條目不再被正常使用時,會被自動刪除。它的鍵值均支持。和絕大多數的集合類一樣,這個類不是同步的。 本文簡介 WeakHashMap類概覽 WeakHashMap類構造器總結 WeakHashMap類構造方法 WeakHasjMap類使用舉例 1. WeakHashMap類概覽 Wea...
摘要:因此,誤解幾乎是與之俱來的。這是完全錯誤的。就像所強調的,對于一個被稱作的來說,狀態轉移管理是一個必須要完成的需求。你可以將其稱為或是,但是請不要把它叫做。 2000年的時候,Douglas Crockford聲明JavaScript是最被誤解的編程語言。這種誤解來源于不良的命名規范,錯誤設計,非標準模式等等。因此,誤解幾乎是與之俱來的。 我也在關于Restful架構上發表了一個相似的...
摘要:否則它就會用新的值替代當前值。在這種情況下,鎖可能會優于原子變量,但在實際的爭用級別中,原子變量的性能優于鎖。在中引入了另外一個構件。 題目要求 在我們深入了解CAS(Compare And Swap)策略以及它是如何在AtomicInteger這樣的原子構造器中使用的,首先來看一下這段代碼: public class MyApp { private volatile int ...
摘要:根本上來說,這意味著不僅要將整個應用程序分解,而且要將任何一個服務器中的各個部分分解為多個模塊化容器,這些容器易于參數化和重復使用。在中,這種模塊化容器服務的實施者是。一個是指一組共享文件系統,內核命名空間和地址的一組容器。 過去幾年容器逐漸成為了打包和部署代碼的流行的方式。容器鏡像解決很多現有的打包和部署工具所帶來的問題,初次以外,還為我們提供了構建分布式應用的全新的思路。就如SOA...
閱讀 1945·2021-11-22 14:44
閱讀 1680·2021-11-02 14:46
閱讀 3670·2021-10-13 09:40
閱讀 2606·2021-09-07 09:58
閱讀 1617·2021-09-03 10:28
閱讀 1666·2019-08-29 15:30
閱讀 984·2019-08-29 15:28
閱讀 1474·2019-08-26 12:20