web-dev-qa-db-ja.com

Javaで「Boolean.TRUE.equals(x)」の理由はありますか?

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

(これはJavaです)

_if (Boolean.TRUE.equals(foo.isBar()))
_

Foo#isBar()boolean isBar()として定義されているため、nullを返すことはできません。

それがそのように書かれるべきである理由は本当に何かありますか?私自身はただ書くだろう

_if (foo.isBar())
_

、しかしおそらく私は微妙な何かが欠けています。

ありがとう

19
user1508893

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

13
Kevin

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

以上if (foo.isBar())失敗すると失敗しますfoo.isBar()ブールNULLを返します。

17
Yogendra Singh

私は「正当な理由のない古いレガシーコード」を疑うでしょう-そして実際、私はそれが悪いであると主張します。 (intsはどのように比較されるのだろうか..)

_TRUE.equals_を使用するコードには、ボクシングの変換、追加のメソッド呼び出し(およびその中のすべて)が必要であり、最終的にはずさんなように見えます


私が知っている唯一の理由は、_foo.isBar_ wasBooleanではなく)booleanを返すものとして入力された場合とnullを返す可能性がある場所です。

_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;
_
2
user166390

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

if(foo == true)の代わりにif(foo)

おそらくこれは似たようなケースですか?

1
lockstock