为什么不鼓励使用immutable null?

时间:2017-04-26 10:53:11

标签: java java-8 guava nullable immutables-library

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

查看this章节,第一行说:

  

不鼓励使用可空属性。

所以我的问题是:

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

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

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
},

如何完全删除空白字段?

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

POSTEDIT:

我刚发现可选即使存在也不会显示实际值,但它只显示真/假值,因此我不需要它。

1 个答案:

答案 0 :(得分:6)

这正是IMO的要点,你不知道对象是否为空;因此,在以后使用它时,您显然可以获得NullPointerException。通过使用禁止它的库,你不会关心某些东西是否为null(因为它不会为null),因此代码更少,if更少 - 使用潜在的空值检查污染代码的语句。< / p>

同样具有空引用可能在不同的上下文中意味着不同的东西。例如,我看到代码需要Boolean的三种状态:truefalse且尚未设置(如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

我在这个主题上看过/读过的投注文章是Guava explanation