空安全布尔表达式评估
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 commons
或 Guava'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,你当前的代码可能是最佳的。
是否有 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 commons
或 Guava'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,你当前的代码可能是最佳的。