空安全布尔表达式评估

Null safe boolean expression evaluation

是否有 Null 和 NullPointer 安全方法来评估布尔表达式。

这是我们代码库中的示例 -

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);
}

当我在 apache commonsGuava's common object utils.[=16= 中查看 BooleanUtils 时,我找不到开箱即用的东西]

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

不能有 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 为此类问题引入了新的可选 class(另请参阅此信息 article):

但我不相信它会产生可读代码:

if (response.flatMap(Response::getMetadata).map(MetaData::getReturnCode).orElse(0) != 0)

(此代码中可能有很多错误,但您明白了)。

上面的文章还提到了Groovy的安全导航运算符?这允许一个非常优雅的表达式:

 if (response.getMetaData()?.getResponseCode()? != 0)

(再次未测试)。 但是 Java 不是 Groovy,所以我认为如果你不 want/can 不使用 Optionals,你当前的代码可能是最佳的。