2016-12-14 10 views
-1

はJavaでは、これは動作します:は、尋ねる

String foo = a(); 
if(foo == null){ 
    foo = b(); 
} 
if(foo != null){ 
    list1.add(foo); 
} 

しかし、それはそれはあるかのように扱われるべきであるように見えるので、見てその醜いです/そうではありませんが、そうではありません。変数がヌルでない値に設定された後に、変数がまだヌルであるかどうかのチェックを処理するきちんとした方法はありますか?

+0

OOPのアプローチは、フォールバックパターンを実装することです。有効な結果が得られるまで、すべての実装を試してみてください。また、 'Optional <>'クラス(https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html)をチェックすることもできます。 – sturcotte06

+0

Groovyを使うことができれば、 'String foo = a()?:b()'です。 – chrylis

+0

もし条件string foo =(a()!= null)なら避けたいのですか? a():b(); if(foo!= null){ list1.add(foo); } – Developer

答えて

1

あなたは2つのオプションがあります。fooは、これまで "null可能性があり、" 値が割り当てられている場合

1)Optionalクラス

// if a() returns an Optional<String> 
String foo = a().orElse(b()); 
if (foo != null) list1.add(foo); 

2)フォールバック

// With a better interface name. 
interface Fallback { 
    // With a better method name. 
    String get(); 
} 

List<Fallback> fallbacks = new ArrayList<>() {{ }}; // add all fallbacks 
for (Fallback fallback : fallbacks) { 
    String foo = fallback.get(); 
    if (foo != null) { 
     list1.add(foo); 
     break; 
    } 
} 
0

ためChain of Responsibilityパターンを、もしあなたのプログラムが問題になるのであれば、fooはいつでもです、はい、あなたはすべての個別の割り当ての後にチェックする必要があります。これを修正するパターンはありません。

問題がコードクラッターである場合、最初の数行を関数にラップしています。

String getFoo() { 
    String _a = a(); 
    if(_a != null) return _a; 
    else return b(); 
} 

/*...*/ 

foo = getFoo(); 
if(foo != null) 
    list1.add(foo); 

代わりに、あなたはそれはそれは期待しているものは何でもオブジェクトではなくnullを渡されたところ正常ケースを処理するカスタムコンテナ(またはlist1が何であれタイプのラッパー)を書くことができます。

関連する問題