2017-04-26 84 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

查看我編輯的問題 –

相關問題