私が取り組んでいるプロジェクトの1つでこのコードに出くわしました
(これはJavaです)
_if (Boolean.TRUE.equals(foo.isBar()))
_
Foo#isBar()はboolean isBar()
として定義されているため、null
を返すことはできません。
それがそのように書かれるべきである理由は本当に何かありますか?私自身はただ書くだろう
_if (foo.isBar())
_
、しかしおそらく私は微妙な何かが欠けています。
ありがとう
isBar
はプリミティブboolean
を返すため、セマンティックの違いはありません。さらに、2番目の方法は、呼び出しのために結果をオートボックス化してから元のブール値を再度抽出する必要がないため、より簡潔で、より明確で、より効率的です。これらすべてを考慮すると、最初の方法を使用する理由はなく、2番目の方法を使用する理由はいくつかあるため、2番目の方法を使用してください。私は仲間のコーダーにかなりの余裕を与えますが、私は座って、プロのコードにそのようなものを追加した人とチャットしました。
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を返します。
私は「正当な理由のない古いレガシーコード」を疑うでしょう-そして実際、私はそれが悪いであると主張します。 (int
sはどのように比較されるのだろうか..)
_TRUE.equals
_を使用するコードには、ボクシングの変換、追加のメソッド呼び出し(およびその中のすべて)が必要であり、最終的にはずさんなように見えます。
私が知っている唯一の理由は、_foo.isBar
_ was(Boolean
ではなく)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;
_
一部の人々は(私自身は彼らの一人ではない)、過度に明示的であるとブール条件がより読みやすくなると信じています。たとえば、
if(foo == true)
の代わりにif(foo)
おそらくこれは似たようなケースですか?