是否有Null和NullPointer安全方法来评估布尔表达式。
以下是我们代码库中的一个示例 -
this.render
我想写的是 -
private boolean serviceReturnedSuccess(Response response) {
boolean isSuccess = true;
if (response.hasMetadata()) {
Metadata responseMetadata = response.getMetadata();
if (responseMetadata.hasReturnCode()) {
if (responseMetadata.getReturnCode() != 0) {
isSuccess = false;
}
}
}
return isSuccess;
}
当我在private boolean serviceReturnedSuccess(Response response) {
return NullSafeBooleanEvaluator.valueOf(response.getMetadata().getReturnCode() != 0);
}
或BooleanUtils
common object utils中查看apache commons
时,我无法找到开箱即用的内容。
我理想地在一个标准库中寻找实现,否则我正在寻找实现它的通用方法。
答案 0 :(得分:2)
由于必须在将参数表达式传递给NullSafeBooleanEvaluator.valueOf(response.getMetadata().getReturnCode() != 0)
之前对其进行求值,因此不能成为NullSafeBooleanEvaluator.valueOf()
。最接近的解决方案是
private boolean serviceReturnedSuccess(Response response) {
try {
return response.getMetadata().getReturnCode() != 0;
}
catch (NullPointerException e) {
return false;
}
}
当然有一些代码味道。
正如Egor已经评论过Java 8为这些问题引入了新的Optional类(另请参阅此信息性article):
但我不相信它会导致可读的代码:
if (response.flatMap(Response::getMetadata).map(MetaData::getReturnCode).orElse(0) != 0)
(这段代码可能有很多错误,但你明白了。)
上面的文章还提到了Groovy的安全导航操作员?这使得表达非常优雅:
if (response.getMetaData()?.getResponseCode()? != 0)
(再次未经测试)。 但是Java不是Groovy,所以如果你不想/不能使用Optionals,我认为你当前的代码可能是最佳的。