Java | 基礎文法:Boolean の扱い

Java Java
スポンサーリンク

Boolean の全体像

Javaの真偽値は「プリミティブの boolean」と「ラッパー型の Boolean」の2種類があります。boolean は値そのもの(true/false)、Boolean は参照型で null を取りうるため「三状態(true/false/不明)」を表せます。条件分岐は主に boolean を使い、API設計で「値がない」を表したいときにだけ Boolean を選びます。


boolean と Boolean の違い

基本の性質と初期化

class Box {
    boolean ready;     // 既定値は false(フィールド)
    Boolean flag;      // 既定値は null(フィールド)
}
Java
  • boolean はプリミティブ。フィールドの既定値は false。ローカル変数は未初期化のまま使えず、代入が必須です。
  • Boolean は参照型。null になり得ます。アンボクシング(Boolean→boolean)時に null だと NullPointerException(NPE)になります。

使い分けの指針

  • 基本は boolean: 条件分岐や計算で null が不要なら常にこちら。
  • Boolean は「不明」を表すときだけ: 入力未取得、設定未確定などの「三状態」を設計として扱いたい場面。

論理演算子(短絡評価と落とし穴)

代表的な演算子

boolean a = true, b = false;
System.out.println(a && b); // AND(短絡)→ false
System.out.println(a || b); // OR(短絡)→ true
System.out.println(!a);     // NOT → false
System.out.println(a ^ b);  // XOR → true
Java
  • && / || は短絡評価: 左が結果を決めれば右側は評価されません(副作用を含む式で重要)。
  • & / | は両辺評価: boolean でも使えるが、右が必ず評価されるため副作用のある式に不向き。通常は && / || を使います。
  • ^ は排他的 OR: どちらか一方が true のときだけ true。

短絡評価を利用したガード

String s = null;
if (s != null && s.length() > 0) {
    // s が null ではない時だけ length を呼ぶ(安全)
}
Java

左で安全確認を済ませると、右でNPEを避けられます。


比較・等価判定(null セーフの書き方)

boolean の比較

boolean ok = true;
// if (ok == true)  // 冗長
if (ok) { /* ... */ }      // これが最も読みやすい
Java

boolean はそのまま条件に使い、true/false との比較は不要です。

Boolean の比較と null 対策

Boolean flag = null;
// if (flag)             // NPE の可能性
if (Boolean.TRUE.equals(flag)) { /* true のときだけ */ }
if (Boolean.FALSE.equals(flag)) { /* false のときだけ */ }
Java
  • Boolean.TRUE.equals(x): x が null のときも安全。true のときだけ真になります。
  • 参照比較(==)は避け、equals を使うと意図が明確になります。

パース・文字列化・三状態の扱い(重要ポイントの深掘り)

文字列からの変換

System.out.println(Boolean.parseBoolean("true"));  // true
System.out.println(Boolean.parseBoolean("TRUE"));  // true(大小無視)
System.out.println(Boolean.parseBoolean("yes"));   // false("true"以外はすべて false)
Java
  • parseBoolean は厳格: 文字列が “true”(大小無視)なら true、それ以外はすべて false。曖昧な入力(”yes”/”1″)は自前で解釈ルールを作る必要があります。

文字列化

Boolean b = null;
System.out.println(String.valueOf(b)); // "null"
System.out.println(Boolean.toString(true)); // "true"
Java

UI表示で「未設定」を区別したいなら、null を特別表示に変換してから出すのが親切です。

三状態(true/false/未設定)の設計

  • 条件分岐の早期正規化: 入口で null を既定値に変換し、内部は boolean で扱うと安全。
  • 意味としての未設定を維持したい場合: 検証・保存の層までは Boolean のまま運び、評価直前に既定値へ。
static boolean normalize(Boolean b, boolean def) {
    return (b != null) ? b : def;
}
Java

パフォーマンスとオートボクシング

自動変換の落とし穴

Boolean bb = true; // ボクシング
boolean x = bb;    // アンボクシング(bb が null だと NPE)
Java
  • 大量ループではプリミティブ: ボクシング/アンボクシングはオブジェクトを生成しGCコストが増えます。計算・判定は boolean で。
  • コレクションに入れる場合のみ Boolean: それ以外は原則 boolean。

条件式の書き方と可読性(重要ポイントの深掘り)

条件の分解と早期 return

static String label(Boolean enabled) {
    if (!Boolean.TRUE.equals(enabled)) return "DISABLED"; // null/false をひとまとめ
    return "ENABLED";
}
Java

「null と false を同じ扱いにする」などのポリシーを先頭で決めると、後続が読みやすくなります。

三項演算子でコンパクトに

boolean ok = true;
String msg = ok ? "OK" : "NG";
Java

短い分岐は三項演算子で簡潔に。ただしネストさせない、条件は読みやすく。


実用例で身につける

例 1: 入力 Boolean を安全に扱う

public class SafeBoolean {
    static boolean isEnabled(Boolean b) {
        return Boolean.TRUE.equals(b); // null でも安全
    }
    public static void main(String[] args) {
        System.out.println(isEnabled(null));   // false
        System.out.println(isEnabled(Boolean.FALSE)); // false
        System.out.println(isEnabled(Boolean.TRUE));  // true
    }
}
Java

例 2: 短絡評価でNPEを避ける

public class ShortCircuit {
    static boolean hasText(String s) {
        return s != null && !s.isBlank();
    }
    public static void main(String[] args) {
        System.out.println(hasText(null));     // false
        System.out.println(hasText("  "));     // false
        System.out.println(hasText("Java"));   // true
    }
}
Java

例 3: 三状態を方針で正規化してから使う

public class Normalize {
    static boolean normalize(Boolean b, boolean def) {
        return (b != null) ? b : def;
    }
    public static void main(String[] args) {
        Boolean input = null; // 未設定は「既定値 false」に
        boolean enabled = normalize(input, false);
        System.out.println(enabled); // false
    }
}
Java

仕上げのアドバイス(重要部分のまとめ)

  • boolean と Boolean は役割が違う。基本は boolean、三状態が必要なら Boolean。
  • && / || の短絡評価を活かして安全なガードを書く。& / | は両辺評価なので通常は使わない。
  • Boolean の等価判定は Boolean.TRUE/Boolean.FALSE.equals(…) で null セーフに。
  • parseBoolean は “true” だけを true とみなし、それ以外は false。曖昧入力は自前で解釈。
  • オートボクシングは便利だが、null アンボクシングのNPEと性能コストを忘れず、必要箇所以外はプリミティブで設計する。

タイトルとURLをコピーしました