空安全布尔表达式求值

时间:2015-07-08 18:52:33

标签: java nullpointerexception null

是否有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时,我无法找到开箱即用的内容。

我理想地在一个标准库中寻找实现,否则我正在寻找实现它的通用方法。

1 个答案:

答案 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,我认为你当前的代码可能是最佳的。