空检查增加了代码的认知复杂性



考虑POJO如下:

class Person {
private String name;
private Address address;
private UserProperties properties;
//getters, stetters, etc
}
class Adddress {
private String state;
private Street street;
private String country;
}
class Street { 
private String line1;
private String line2;
}
class PersonAttributes {
private String nationality;
private String age;
}

所以情况是这样的:

  1. 我无法控制POJO,它是一个预定义的结构
  2. 任何字段都可以为null
  3. 它只是一个示例,实际的POJO要复杂得多,而且嵌套得多

当我查询字段时,我必须添加一个null检查以防止null指针异常。

例如:

if (person.getAddress() != null) {
//do an operation on address
if (person.getAddress().getStreet() != null) {
//do operation on street
}
}

类似于属性和其他嵌套字段。

是否有任何替代上述方法的方法可以降低复杂性并避免所有这些空检查?

我从REST API中获取所有字段,并使用Jackson将其分配给POJO。

这种方法对于高度嵌套的JSON结构正确吗?或者我应该使用其他选项?

正如在注释中所说,您无法避免空检查。

你可以"美化"他们一点:

import static java.util.Objects.*;
…
if( nonNull( person.getAddress ) )
{
if( nonNull( person.getAdddress().getStreet() ) )
{
…
}
}

您可以在顶层元素上为更深嵌套元素中的字段引入getter:

class Person
{
…
public String getStreet()
{
var address = getAddress();
var retValue = isNull( address ) ? null : address.getStreet();
return retValue;
}
}
…
if( nonNull( person.getStreet() ) )
{
…
}

这可以稍微减少顶级代码的混乱。

如果允许您更改getter的返回类型,那么使用java.util.Optional也可以是一种选择:

class Person
{
…
public Optional<Address> getAddress()
{
return Optional.ofNullable( address );
}
public Optional<String> getStreet()
{
var retValue = getAddress().map( a -> getStreet() );
return retValue;
}
}
…
if( person.getStreet().isPresent() )
{
…
}

但如前所述,逻辑基本上保持不变,只是看起来有所不同。

最新更新