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) { /* ... */ } // これが最も読みやすい
Javaboolean はそのまま条件に使い、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"
JavaUI表示で「未設定」を区別したいなら、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と性能コストを忘れず、必要箇所以外はプリミティブで設計する。
