20

この質問に対する「いいえ」の答えを待っています。

if節で変数をチェックすると同時に変数を保存できるかどうかに興味がありました。

このコードがあるとしましょう。

if(foo!=null){
  if(foo.getBar()!=null){
    Bar bar = foo.getBar();
    System.out.println("Success: " + bar);
  } else {
    System.out.println("Failure.");
  }
} else {
  System.out.println("Failure.");
}

結果が同じであっても、「失敗」状態を個別に処理するようになりました。次のようにまとめることができます。

if(foo!=null && foo.getBar()!=null){
  Bar bar = foo.getBar();
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failure.");
} 

すでにはるかにきれいなコード。foo が null の場合、そこで停止し、(if で) foo.getBar を試行しないため、NPE は取得されません。私が強化したい最後のことと主な質問: foo.getBar() を 2 回呼び出すことは本当にありますか? getBar() が非常に負荷の高い操作になる場合は、2 回目の同一の呼び出しを回避できればよいでしょう。だから、これに似た何かをすることが何とか可能かどうか疑問に思っています:

if(foo!=null && (Bar bar = foo.getBar())!=null){
  Bar bar = foo.getBar();
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failure.");
}

私がやりたいのであれば、それを2つの異なるものに分割する必要があります

Bar bar = foo.getBar();
if (bar!=null) ...
4

7 に答える 7

35

これはあなたが得ることができる最も近いものです:

Bar bar;
if(foo!=null && (bar = foo.getBar())!=null){
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failiure.");
}
于 2009-02-19T07:53:21.017 に答える
13

BufferedReader からの行を反復処理するときに、その手法を使用しました。

BufferedReader br = // create reader
String line
while ((line = br.readLine()) != null) {
    // process the line
}

はい、割り当てを行うことができ、その結果は左側の変数になり、確認できます。ただし、テスト内で変数を宣言することは合法ではありません。変数はその式にのみスコープされるためです。

于 2009-02-19T07:52:01.177 に答える
7

Bar bar のスコープを制限したい場合は、Michael が投稿したコードの周りに { と } を追加します。

無効な foo()
{
    // いくつかのコード ...

    // このブロックは "Bar bar" のスコープを制限し、メソッドの残りの部分が見えないようにします
    // それ。
    {
        バーバー;
        if(foo!=null && (バー = foo.getBar())!=null){
            System.out.println("成功: " + バー);
        } そうしないと {
            System.out.println("失敗。");
        }
    }
}

意味がある場合は、null オブジェクト パターンをチェックインすることもできます。私は個人的に、できればnullになることを避けようとしています... nullを許可するかどうかを本当に考えてください。

于 2009-02-19T08:07:50.700 に答える
1

質問に完全に答えられない3つのポイント:

null悪です。それを返すメソッドを書かないでください。その後、問題の例は消えます。

カプセル化を見逃しているのではないかと思います。代わりに、「聞かないでください」という操作を実行するようfoo.getBar()にインターフェースを作成することはできますか?foo

式の副作用は悪いコードを引き起こす傾向があります。バグの多い行よりも、単純な行の方が優先されます。++バッファにアクセスするときにインデックスをインクリメントするために使用する場合の通常の例外、または同様のイテレータスタイルのアルゴリズム。

于 2009-02-19T13:06:08.317 に答える