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