2017-04-26 8 views
2

私は現在、WebアプリケーションからJSONオブジェクトを生成するために不変ライブラリを使用しています。 this章を見てみるとなぜ不変のnullが推奨されないのですか?

、最初の行は言う:

NULL可能な属性の使用は推奨されません。

だから私の質問は次のとおりです。

1)なぜ?ヌルオブジェクトの何が問題になっていますか?

2)項目はそれほど失敗するクラス分けビルダーコードを使用して、nullであるか、ない場合、私はthirdyオブジェクトのラッパーを使用していると私は知っていないものであれば:

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

が任意の最適あり溶液?

EDIT:

@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の場合、コンテキストが異なることがあります。たとえば、Booleanの3つの状態: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

+0

あるのでpossibile方法も考えられます。 ビルダーbuilder = ImmutableAccount \t \t \t \t .builder() if(input.getMobile()!= null)builder.mobile(input.getMobile()); builder.build() –

+1

@FabrizioStellatoを返すことができます - はい。あなたのケースでは、この場合は 'Optional.empty()'を格納することができます。あるいは、ビルダーが代わりにこのヌルを使って何かをすることさえあります - それは依存しています。 – Eugene

+0

私の編集した質問を参照してください –

関連する問題