摘要:在之前加入的三個(gè)方法并不支持在對(duì)象為空時(shí)返回一個(gè)默認(rèn)值。取而代之的是,這三個(gè)方法會(huì)拋出。中新加入的兩個(gè)方法則會(huì)在傳入值為時(shí)返回一個(gè)默認(rèn)值。還加了一個(gè)有相同功能的方法。當(dāng)傳入的第一個(gè)參數(shù)不是時(shí),該方法將不會(huì)被調(diào)用。
前言
本篇文章重點(diǎn)討論JDK9中添加的靜態(tài)方法,requireNonNullElse和requireNonNullElseGet。
正文JDK9在Object類中新添加了兩個(gè)靜態(tài)方法,requreNonNullElse(T, T)和 requireNonNullElseGet(T obj,Supplier extends T> supplier)。這兩個(gè)方法簡(jiǎn)化了判斷對(duì)象是否為空(null),如果是空的則返回一個(gè)默認(rèn)值。因此,這兩個(gè)方法和早期JDK版本中引入的方法requireNonNull(T),requireNonNull(T,String)和requireNonNull(T,Supplier
在JDK9之前加入的三個(gè)方法并不支持在對(duì)象為空時(shí)返回一個(gè)默認(rèn)值。取而代之的是,這三個(gè)方法會(huì)拋出NullPointerException。JDK9中新加入的兩個(gè)方法則會(huì)在傳入值為null時(shí)返回一個(gè)默認(rèn)值。
Objects.requireNonNullElse(T,T)是新加入的兩個(gè)方法中,最直接明了的定義返回值的方法。下面的這段代碼展示了如何使用該方法:
/** * 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(); }
在上面的例子中,如果提供的參數(shù)對(duì)象inputDate為null的話,默認(rèn)值now(new Date()構(gòu)造函數(shù)返回當(dāng)前的時(shí)間)將會(huì)作為默認(rèn)值返回。
JDK9還加了一個(gè)有相同功能的Objects.requireNonNullElseGet(T,Supplier extends T>)方法。這個(gè)方法和上一個(gè)方法的區(qū)別是,它接收一個(gè)Supplier對(duì)象來(lái)提供默認(rèn)值,而不是直接返回一個(gè)同類型的對(duì)象作為默認(rèn)值。
Modern Java Recipes, Ken Kousen 這本書中寫道:Supplier S的基本用途之一就是支持延遲執(zhí)行。在討論了如何使用JDK中的Supplier之后,他還補(bǔ)充了:可以在代碼中使用延遲執(zhí)行,從而確保只有在時(shí)機(jī)合適時(shí)才會(huì)從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(); }
當(dāng)獲取默認(rèn)值的過(guò)程預(yù)計(jì)會(huì)運(yùn)行較常時(shí)間時(shí),傳入一個(gè)Supplier作為獲取默認(rèn)值的方法會(huì)很有優(yōu)勢(shì)。這時(shí),只有當(dāng)傳入的第一個(gè)參數(shù)為null時(shí)才會(huì)執(zhí)行該方法。當(dāng)傳入的第一個(gè)參數(shù)不是null時(shí),該方法將不會(huì)被調(diào)用。
本文中提到的兩個(gè)方法簡(jiǎn)化了判斷一個(gè)參數(shù)是否為null并在為null時(shí)返回一個(gè)默認(rèn)值的過(guò)程。它們最長(zhǎng)用來(lái)實(shí)現(xiàn)防御性編程,當(dāng)然也有其他的應(yīng)用場(chǎng)景。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68490.html
摘要:前言這周我準(zhǔn)備介紹一個(gè)有趣的但是很少使用的方法按照合約編程,又稱為合約編程,是一種軟件設(shè)計(jì)的方法。這些規(guī)則被稱為合約,可以比擬為商業(yè)合同中的條件和義務(wù)。通過(guò)將檢查和異常拋出指令包裝到方法中,人們可以很容易地實(shí)現(xiàn)合約式編程。 前言 這周我準(zhǔn)備介紹一個(gè)有趣的但是很少使用的方法 按照合約編程,又稱為合約編程,是一種軟件設(shè)計(jì)的方法。它規(guī)定了軟件設(shè)計(jì)師應(yīng)該為軟件組件定義正式,精確和可驗(yàn)證的接口規(guī)...
摘要:本文簡(jiǎn)介類概覽類構(gòu)造器總結(jié)類構(gòu)造方法類使用舉例類概覽是一個(gè)實(shí)現(xiàn)了接口,并且鍵為型的哈希表。中的條目不再被正常使用時(shí),會(huì)被自動(dòng)刪除。它的鍵值均支持。和絕大多數(shù)的集合類一樣,這個(gè)類不是同步的。 本文簡(jiǎn)介 WeakHashMap類概覽 WeakHashMap類構(gòu)造器總結(jié) WeakHashMap類構(gòu)造方法 WeakHasjMap類使用舉例 1. WeakHashMap類概覽 Wea...
摘要:因此,誤解幾乎是與之俱來(lái)的。這是完全錯(cuò)誤的。就像所強(qiáng)調(diào)的,對(duì)于一個(gè)被稱作的來(lái)說(shuō),狀態(tài)轉(zhuǎn)移管理是一個(gè)必須要完成的需求。你可以將其稱為或是,但是請(qǐng)不要把它叫做。 2000年的時(shí)候,Douglas Crockford聲明JavaScript是最被誤解的編程語(yǔ)言。這種誤解來(lái)源于不良的命名規(guī)范,錯(cuò)誤設(shè)計(jì),非標(biāo)準(zhǔn)模式等等。因此,誤解幾乎是與之俱來(lái)的。 我也在關(guān)于Restful架構(gòu)上發(fā)表了一個(gè)相似的...
摘要:否則它就會(huì)用新的值替代當(dāng)前值。在這種情況下,鎖可能會(huì)優(yōu)于原子變量,但在實(shí)際的爭(zhēng)用級(jí)別中,原子變量的性能優(yōu)于鎖。在中引入了另外一個(gè)構(gòu)件。 題目要求 在我們深入了解CAS(Compare And Swap)策略以及它是如何在AtomicInteger這樣的原子構(gòu)造器中使用的,首先來(lái)看一下這段代碼: public class MyApp { private volatile int ...
摘要:根本上來(lái)說(shuō),這意味著不僅要將整個(gè)應(yīng)用程序分解,而且要將任何一個(gè)服務(wù)器中的各個(gè)部分分解為多個(gè)模塊化容器,這些容器易于參數(shù)化和重復(fù)使用。在中,這種模塊化容器服務(wù)的實(shí)施者是。一個(gè)是指一組共享文件系統(tǒng),內(nèi)核命名空間和地址的一組容器。 過(guò)去幾年容器逐漸成為了打包和部署代碼的流行的方式。容器鏡像解決很多現(xiàn)有的打包和部署工具所帶來(lái)的問(wèn)題,初次以外,還為我們提供了構(gòu)建分布式應(yīng)用的全新的思路。就如SOA...
閱讀 1948·2021-11-22 14:44
閱讀 1682·2021-11-02 14:46
閱讀 3674·2021-10-13 09:40
閱讀 2609·2021-09-07 09:58
閱讀 1628·2021-09-03 10:28
閱讀 1669·2019-08-29 15:30
閱讀 987·2019-08-29 15:28
閱讀 1477·2019-08-26 12:20