聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

Javaでboolean型の変数のtrue/false判定を行う方法について

これは何

Javaでboolean型の変数のtrue/false比較を行う方法についてつらつらと考えたもの

発端

若手メンバーが書いたコードをレビューしていたら

boolean flag = true;
  :
if(Objects.equals(flag, false)) {
     :
}

というコードを見かけた。

処理としては間違ってはいないのだけど、boolean型なので

if(!flag) {
   :
}

と書くように指導した。

値を比較する時は、Objects.equals(a, b)を使うようにコーディングルールを設けていたので 深く考えずにそのままコピペしてしまったのだと思われる。

boolean値の比較について

boolean値の比較方法については、下記2種類の書き方についての議論がよく見られる。

//否定を!マークで示す
if(!flag) {
   :
}

//!マークは見づらいので == false と書いてわかりやすくする
if(flag == false) {
   :
}

他に書き方はないものかと思案してみた。

まず、Objects.equalsを使う書き方。Boolean.TRUEまたはBoolean.FALSEと比較することで見やすくはなっているが、 比較対象を明示してあげないといけないというのが煩雑に感じる。

if(Objects.equals(b, Boolean.TRUE)) {
    :
}

if(Objects.equals(b, Boolean.FALSE)) {
    :
}

apache commonsを見ていたところ、BooleanUtils.javaisTrue()isFalse()というメソッドがあるのを発見した。

BooleanUtils (Apache Commons Lang 3.10 API)

if(BooleanUtils.isTrue(b)) {
    :
}

if(BooleanUtils.isFalse(b)) {
    :
}

こうやって書いてみると、意外とわかりやすい気もする。 引数の型がBooleanなので、bの値がnullでも安心である。 そもそも、true/falseのどちらなのかを判定したいのに、nullという第三の可能性が起きうる時点で プログラムに何か間違いがある可能性の方が大きいわけではあるが…。

まぁ標準でBoolean型とか、ObjectsクラスにisTrue()isFalse()メソッドが生えてくれるのが一番わかりやすいので いつか実装されないかなぁ。