【发布时间】:2017-05-17 08:19:46
【问题描述】:
使用 Java,可以安全地访问深层嵌套引用,例如
a.b.c.d.e,我们通常必须在每个级别指定空检查或包装在Optionals 中并使用orElse()。 (与 a?.b?.c?.d?.e 或类似工作的 Kotlin/C# 等语言不同。
我想知道以下辅助方法是否是一个合理的替代方法:
public <T> T valueOrNull(Supplier<T> expression) {
try {
return expression.get();
} catch (NullPointerException e) {
return null;
}
}
这可以安全地与value = valueOrNull(() -> a.b.c.d.e)一起使用。
注意:我知道捕获 NullPointerExceptions 通常会因为性能等原因而受到反对,但我想知道这里的用法是否是一个合理的例外。
【问题讨论】:
-
捕获
NullPointerExceptions与性能无关,与一般代码质量有很大关系。 -
有人甚至会争辩说,必须写
a.b.c.d.e(或a?.b?.c?.d?.e)已经表明设计可疑(并不是说我不欢迎这样的运算符,但我倾向于得到更少的嵌套)。 -
@Kayaman 我提到了性能,因为对控制流使用异常通常比简单的分支要慢得多。如果仅将此方法隔离到此方法,则代码质量不会成为太大问题。关于您的第二条评论,在大多数情况下这可能是正确的,但考虑一个表示 XML 模式的 POJO,您在其中使用 JAXB 或类似的东西进行转换。必须访问深度嵌套的 xml 节点是有效的,您无法确定路径的有效性。
-
这比使用
Optional的灵活性要低得多,而且我认为稍微减少的冗长不值得引入这样的实用程序。 -
@Hulk 我不同意这两点。我可以想象,当使用深度嵌套的 if 子句重构遗留代码时,这将是一个有用的工具。此外,这不是作为
Optional的替代品提供的,而是作为补充提供的。
标签: java nullpointerexception null null-coalescing-operator