2017-04-26 130 views
2

我目前使用Immutable库来从我的web应用程序中生成JSON对象。为什么不可变的null不鼓励?

this章来看,第一行说:

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

所以我的问题是:

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

2)我使用的是什么,如果thirdy对象的包装,我不知道,如果项目为空或不是,所以使用分级生成器生成代码将失败:

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:

我刚刚发现,即使目前可选没有显示出真正的价值,但它只是显示真/假值,所以我并不需要它。

回答

6

这正是IMO的观点,你不知道对象是否为null;所以当以后使用它时,你显然会得到一个NullPointerException。通过使用一个禁止这样的库,你不会在乎是否有null或不为null(因为它不会为null),因此代码更少并且更少 - 污染具有潜在空检查的代码的语句。

也有一个空引用可能意味着不同的情况下不同的事情。例如,我看到代码需要三个状态Booleantrue,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

+0

因此,一个不可能性的方式可能是也: 生成器builder = ImmutableAccount \t \t \t \t \t .builder() if(input.getMobile()!= null)builder.mobile(input.getMobile()); return builder.build() –

+1

@FabrizioStellato它可能是 - 是的。在这种情况下,存储'Optional.empty()'可能是正确的。或者甚至建设者用这个null来做一些事情 - 这取决于。 – Eugene

+0

查看我编辑的问题 –

相关问题