objects jdk8
JDK 9向Objects类添加了一些新方法,包括本文中突出显示的两个static
方法: requireNonNullElse(T,T)和requireNonNullElseGet(T obj,Supplier <?extended T>供应商) 。 这两种方法使得更容易验证给定的对象是不 null
,并且如果提供可变原来是提供一种替代的null
。 因此,这些方法和早期JDK版本中引入到Objects
的相似方法[ requireNonNull(T) , requireNonNull(T,String)和requireNonNull(T,Supplier <String>) ]最有可能用于在方法中实现保护子句 。
当确定要测试的对象为null
时,在JDK 9之前添加到Objects
的最后一段中提到的三种方法不允许使用“默认”值。 相反,当传递给它们的变量为null
时,这三个方法中的每一个都会引发NullPointerException 。 在JDK 9中添加到Objects
的两个方法确实允许指定一个默认值,该默认值可以由该方法返回,而不是该方法抛出NullPointerException
。
Objects.requireNonNullElse(T,T)是两个新添加的方法中最直接的方法,用于指定当所测试的变量为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();
}
在上面的示例中,如果提供的Date类型的变量为null
,则返回提供的默认值“ now”(基于调用不接受参数的Date构造函数 )。
JDK 9还添加了Objects.requireNonNullElseGet(T,Supplier <?extended T>)方法用于类似目的。 该方法与前面讨论的方法的不同之处在于,它接受提供默认值的供应商 ,而不是接受相同类型的另一个对象作为默认值。
Ken Kousen在强烈推荐的《 现代Java食谱 》一书中写道:“ Supplier
的主要用例之一是支持延迟执行的概念。” 在讨论了Supplier
在JDK中的用法之后,他补充说:“可以在您自己的代码中使用此延迟执行过程,以确保仅在适当时才从Supplier
检索值。” 我的下一个示例演示了这一点。
下面显示了一个高度人为的代码清单,并演示了此方法接受Supplier
。
Objects.requireNonNullElseGet(T,Supplier<? extends 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} 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
,不会调用长时间运行的方法。 [顺便说一句,我在这里没有显示calculateDate()
的实现,因为它是可笑的,但是可以说它有意地花费很长时间来执行。
覆盖在这个岗位,这两种方法可以很容易地检测一个特定的变量为null
,并代替它提供了一个合适的替代品时,它是null
。 这些可能最常用于实现“保护条款”,但是它们返回默认值的能力也可能导致其他用例。
翻译自: https://www.javacodegeeks.com/2018/02/jdk-9-notnullorelse-methods-added-objects-class.html
objects jdk8