摘要:在之前加入的三个方法并不支持在对象为空时返回一个默认值。取而代之的是,这三个方法会抛出。中新加入的两个方法则会在传入值为时返回一个默认值。还加了一个有相同功能的方法。当传入的第一个参数不是时,该方法将不会被调用。
前言
本篇文章重点讨论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时返回一个默认值的过程。它们最长用来实现防御性编程,当然也有其他的应用场景。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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...
阅读 1886·2021-11-22 14:44
阅读 1649·2021-11-02 14:46
阅读 3602·2021-10-13 09:40
阅读 2584·2021-09-07 09:58
阅读 1509·2021-09-03 10:28
阅读 1640·2019-08-29 15:30
阅读 956·2019-08-29 15:28
阅读 1447·2019-08-26 12:20