2

我目前正在使用不可变库从我的 Web 应用程序生成 JSON 对象。

这一章,第一行说:

不鼓励使用可为空的属性。

所以我的问题是:

1)为什么?空对象有什么问题?

2) 如果我使用的是第三方对象的包装器并且我不知道 item 是否为空,那么使用分类构建器代码将失败怎么办:

MyImmutableWrapperObject
    .builder().
    .mobile(input.getMobile()) // don't know if null or not
    .build();

有没有最优解?

编辑:

@JsonProperty("mobile")
public abstract Optional<String> mobile();  

...

// composing builder
if (input.getMobile() != null)
        builder.mobile(input.getMobile());

生成的json是:

"mobile": {
    "present": false
},

如何完全删除空字段?

我读了这个,但是它使用 gson.toJson 返回一个 String 对象,这不是我想要的方式。

后编辑:

我刚刚发现Optional即使存在也不会显示真正的价值,但它只是显示真/假值,所以我不需要它。

4

1 回答 1

6

这正是 IMO 的重点,您不知道对象是否为空;因此,当以后使用它时,您显然可能会得到一个NullPointerException. 通过使用禁止这种情况的库,您将不在乎某些内容是 null 还是非 null(因为它不会为 null),因此更少的代码和更少if的语句会通过潜在的 null 检查污染代码。

在不同的上下文中,也有一个空引用可能意味着不同的事情。例如,我已经看到代码需要三个状态来表示 a Boolean: truefalse并且还没有设置(as null)。我发现那是错误的,但仍然偶尔会看到它。

这就是为什么Optional在 Guava 中引入,现在在 JDK 中的原因。它迫使用户主动使用Optional. 例如:

  Optional<Integer> i...

  if(i.isPresent()).... // you are forced to do this check

显然你可以这样做:

 i.get()

但是该方法已记录在案,它可能会中断。

对于参考而言,情况并非如此:

 Integer i  = null;
 if(i == null) // this is not an operation that is mandatory

迄今为止我看过/读过的关于这个主题的打赌文章是番石榴解释

于 2017-04-26T11:11:51.973 回答