成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

貓頭鷹的深夜翻譯:JDK9 NotNullOrElse方法

jone5679 / 2040人閱讀

摘要:在之前加入的三個(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)方法,requireNonNullElserequireNonNullElseGet。

正文

JDK9在Object類中新添加了兩個(gè)靜態(tài)方法,requreNonNullElse(T, T) requireNonNullElseGet(T obj,Supplier supplier)。這兩個(gè)方法簡(jiǎn)化了判斷對(duì)象是否為空(null),如果是空的則返回一個(gè)默認(rèn)值。因此,這兩個(gè)方法和早期JDK版本中引入的方法requireNonNull(T),requireNonNull(T,String)requireNonNull(T,Supplier)可以用來(lái)進(jìn)行防御性編程。

在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)值nownew Date()構(gòu)造函數(shù)返回當(dāng)前的時(shí)間)將會(huì)作為默認(rèn)值返回。

JDK9還加了一個(gè)有相同功能的Objects.requireNonNullElseGet(T,Supplier)方法。這個(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

相關(guān)文章

  • 頭鷹深夜翻譯:在JVM上根據(jù)合約編程

    摘要:前言這周我準(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ī)...

    whatsns 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:Java WeakHashMap

    摘要:本文簡(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...

    BothEyes1993 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:請(qǐng)不要把它叫做Restful!

    摘要:因此,誤解幾乎是與之俱來(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è)相似的...

    dadong 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:Java中CAS(Compare And Swap)

    摘要:否則它就會(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 ...

    hosition 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:分布式系統(tǒng)Toolkit模式

    摘要:根本上來(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...

    hiyayiji 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<