29

私が取り組んでいるプロジェクトの1つでこのコードに出くわしました

(これは Java です)

if (Boolean.TRUE.equals(foo.isBar()))

Foo#isBar()は と定義されてboolean isBar()いるため、戻りませんnull

そのように書かなければならない理由は本当にありますか?私自身はただ書くだろう

if (foo.isBar())

、しかし、おそらく私は微妙なものを見逃しています。

ありがとう

4

6 に答える 6

31

foo.isBar()ブール値を返すことを願っています。その場合、いつでも書くことができますif (foo.isBar())。あなたfoo.isBar()が戻った場合Boolean、それはBoolean.TRUEBoolean.FALSEまたは のいずれかNULLです。その場合if (Boolean.TRUE.equals(foo.isBar()))、if ブロックが 1 つのシナリオ (TRUE) で実行され、残りの 2 つで省略されていることを確認します。

Boolean NULL を返すと、 Over and Aboveif (foo.isBar()) は失敗します。 foo.isBar()

于 2012-10-08T04:01:40.267 に答える
21

isBarプリミティブを返すため、boolean意味上の違いはありません。さらに、2 番目の方法は、呼び出しのために結果を自動ボックス化し、元のブール値を再度抽出する必要がないため、より簡潔で明確で効率的です。以上のことから、最初の方法を使用する理由はなく、いくつかは 2 番目の方法を使用するので、2 番目の方法を使用します。私は仲間のコーダーにかなりの余裕を与えますが、プロのコードにそのようなものを追加した人なら誰とでも座ってチャットします.

于 2012-10-08T04:10:14.463 に答える
5

私は「正当な理由のない古いレガシーコード」を疑うでしょう - そして実際、それはもっと悪いと主張します. (sはどうint比較されるのかな..)

を使用するコードにTRUE.equalsは、ボクシング変換、追加のメソッド呼び出し (および内部のすべて) が必要であり、最終的には、ずさんに見えるだけです。


私が認識している唯一の理由は、返される(ない) として入力された場合と、返される可能性があるfoo.isBar 場所です。Booleanbooleannull

Boolean b = null;

// throws an exception when it tries to unbox b because it is null
boolean isTrue1 = (boolean)b;

// evaluates to false
boolean isTrue2 = Boolean.TRUE.equals(b);

// evaluates to false as well
boolean isTrue3 = b != null ? (boolean)b : false;
于 2012-10-08T03:58:23.750 に答える
1

一部の人々は (私自身はそうではありませんが)、過度に明示的であるとブール条件が読みやすくなると信じています。たとえば、

if(foo == true)それ以外のif(foo)

おそらくこれは同様のケースですか?

于 2012-10-08T04:04:31.080 に答える
-3

最初の条件では、true に対応する Boolean オブジェクトの等価性をチェックしています。Javaバージョンは自動ボックス化解除をサポートしていないため、コードで最初の条件を使用しているため、ブールオブジェクトを使用する必要があります。

JavaのBoolean.TRUEとtrueの違いは何ですか?

于 2012-10-08T03:56:34.970 に答える