我目前正在使用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:
我刚发现可选即使存在也不会显示实际值,但它只显示真/假值,因此我不需要它。
答案 0 :(得分:6)
这正是IMO的要点,你不知道对象是否为空;因此,在以后使用它时,您显然可以获得NullPointerException
。通过使用禁止它的库,你不会关心某些东西是否为null(因为它不会为null),因此代码更少,if
更少 - 使用潜在的空值检查污染代码的语句。< / p>
同样具有空引用可能在不同的上下文中意味着不同的东西。例如,我看到代码需要Boolean
的三种状态:true
,false
且尚未设置(如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