まずは名前が違う

Javaには、 真偽値を扱うための boolean という型があります。

boolean enabled = true;

一方で、 Boolean という クラスも存在します。

Boolean enabled = true;

見た目はかなり似ています。
しかし、この2つは 同じものではありません。

boolean primitive
Boolean Class

booleanは基本データ型

boolean は、 Javaの基本データ型、 いわゆるprimitive型です。

基本的には true または false のどちらかを持ちます。

boolean active = true;

active = false;

ここでは非常にシンプルです。
「有効か、無効か」
「成功したか、失敗したか」
「処理するか、しないか」
といった状態を表すのに向いています。

Booleanはクラス

Boolean は primitive型ではなく、 Javaのクラスです。

Boolean active = Boolean.TRUE;

つまり、 オブジェクトとして扱うことができます。

ここが boolean との 大きな違いの一つです。

POINT

boolean は基本データ型。 Boolean はクラス。
Javaでは、 基本データ型をオブジェクトとして扱うための 「ラッパークラス」が用意されています。

一番重要なのが null

Boolean を使う理由として、 特に重要なのが null を扱えることです。

Boolean value = null;

これは可能です。

一方、

boolean value = null;

これはできません。

boolean true / false
Boolean true / false / null

この違いは、 DBやAPIのデータを扱うときに 特に重要になります。

「false」と「null」は同じではない

例えば、 ユーザーの設定値を取得するとします。

false なら、
「設定値は存在するがOFF」
と考えられます。

一方で、 null なら、
「設定値そのものが存在しない」
という意味にできます。

false OFF
null 未設定

この3状態を区別できることが、 Boolean を使う 一つの理由になります。

booleanをBooleanに代入できる?

Javaでは、 次のようなコードを書くことができます。

boolean value = true;

Boolean objectValue = value;

逆もできます。

Boolean objectValue = Boolean.TRUE;

boolean value = objectValue;

Javaが自動的に primitive型とラッパークラスの変換を 行ってくれます。

これを オートボクシング / アンボクシング と呼びます。

WARNING

Booleannull の状態で primitive型の boolean に 変換しようとすると、 NullPointerExceptionにつながる場合があります。

メソッド引数で混乱しやすいポイント

Javaでは、 メソッドの引数に変数を渡すとき、 「渡した変数そのものを変更できる」 とは限りません。

static void change(Boolean value) {

    value = false;

}

Boolean flag = true;

change(flag);

System.out.println(flag);

このコードでは、 flag の値は そのままです。

メソッドに渡された value に対して 別の値を代入しても、 呼び出し元の変数そのものが 書き換わるわけではありません。

「引数に変数を渡したから、 その変数を直接書き換えられる」
とは考えない。

じゃあ、どうすれば元の値を変えられる?

一番シンプルなのは、 戻り値を利用する方法です。

static Boolean change(Boolean value) {

    return false;

}

Boolean flag = true;

flag = change(flag);

これなら、 メソッドの結果を 呼び出し元の変数に代入できます。

あるいは、 複数の値をまとめて変更する必要があるなら、 オブジェクトを設計する方法もあります。

THINK

「どうやって元の変数を書き換えるか」 だけを考えるより、

「その値を誰が管理するべきなのか?」

と考える方が、 業務コードでは重要になります。

booleanとBoolean、どう使い分ける?

明確に true / false の2状態だけでよいなら、 boolean が分かりやすいです。

boolean enabled = true;

一方で、
「未設定」
「値なし」
「DB上NULL」
のような状態を区別したい場合は、 Boolean が候補になります。

Boolean enabled = null;

特にDBやJSON、 APIレスポンスなど、 外部から取得したデータを扱う場合には この違いを意識する必要があります。

「Booleanにしたら
なんか面倒になった」

最初は boolean で十分だと思っていたのに、 DBやAPIを扱い始めると null が登場する。

そこで Boolean に変更すると、 今度はnullチェックが必要になる。

これは単純に 「Booleanの方が高機能だから使えばいい」 という話ではありません。

その値に、
「未設定」という状態が本当に必要なのか。
そこを考えて型を選ぶ必要があります。

Booleanとbooleanを整理する

boolean true / false
Boolean true / false / null

重要なのは、 「どちらが正しいか」ではありません。

その値が、
「2状態だけなのか」
「未設定という3つ目の状態が必要なのか」
を考えることです。

Javaでは型を選ぶこと自体が、 データの意味を設計することにもつながります。