01 / BASIC
まずは名前が違う
Javaには、
真偽値を扱うための
boolean という型があります。
boolean enabled = true;
一方で、
Boolean という
クラスも存在します。
Boolean enabled = true;
見た目はかなり似ています。
しかし、この2つは
同じものではありません。
02 / PRIMITIVE
booleanは基本データ型
boolean は、
Javaの基本データ型、
いわゆるprimitive型です。
基本的には
true または
false のどちらかを持ちます。
boolean active = true;
active = false;
ここでは非常にシンプルです。
「有効か、無効か」
「成功したか、失敗したか」
「処理するか、しないか」
といった状態を表すのに向いています。
03 / WRAPPER
Booleanはクラス
Boolean は
primitive型ではなく、
Javaのクラスです。
Boolean active = Boolean.TRUE;
つまり、 オブジェクトとして扱うことができます。
ここが
boolean との
大きな違いの一つです。
boolean は基本データ型。
Boolean はクラス。
Javaでは、
基本データ型をオブジェクトとして扱うための
「ラッパークラス」が用意されています。
04 / NULL
一番重要なのが null
Boolean を使う理由として、
特に重要なのが
null を扱えることです。
Boolean value = null;
これは可能です。
一方、
boolean value = null;
これはできません。
この違いは、 DBやAPIのデータを扱うときに 特に重要になります。
05 / PRACTICAL
「false」と「null」は同じではない
例えば、 ユーザーの設定値を取得するとします。
false なら、
「設定値は存在するがOFF」
と考えられます。
一方で、
null なら、
「設定値そのものが存在しない」
という意味にできます。
この3状態を区別できることが、
Boolean を使う
一つの理由になります。
06 / AUTO BOXING
booleanをBooleanに代入できる?
Javaでは、 次のようなコードを書くことができます。
boolean value = true;
Boolean objectValue = value;
逆もできます。
Boolean objectValue = Boolean.TRUE;
boolean value = objectValue;
Javaが自動的に primitive型とラッパークラスの変換を 行ってくれます。
これを オートボクシング / アンボクシング と呼びます。
Boolean が
null の状態で
primitive型の boolean に
変換しようとすると、
NullPointerExceptionにつながる場合があります。
07 / METHOD
メソッド引数で混乱しやすいポイント
Javaでは、 メソッドの引数に変数を渡すとき、 「渡した変数そのものを変更できる」 とは限りません。
static void change(Boolean value) {
value = false;
}
Boolean flag = true;
change(flag);
System.out.println(flag);
このコードでは、
flag の値は
そのままです。
メソッドに渡された
value に対して
別の値を代入しても、
呼び出し元の変数そのものが
書き換わるわけではありません。
「引数に変数を渡したから、 その変数を直接書き換えられる」
とは考えない。
08 / PRACTICAL
じゃあ、どうすれば元の値を変えられる?
一番シンプルなのは、 戻り値を利用する方法です。
static Boolean change(Boolean value) {
return false;
}
Boolean flag = true;
flag = change(flag);
これなら、 メソッドの結果を 呼び出し元の変数に代入できます。
あるいは、 複数の値をまとめて変更する必要があるなら、 オブジェクトを設計する方法もあります。
「どうやって元の変数を書き換えるか」
だけを考えるより、
「その値を誰が管理するべきなのか?」
と考える方が、
業務コードでは重要になります。
09 / USAGE
booleanとBoolean、どう使い分ける?
明確に
true / false
の2状態だけでよいなら、
boolean が分かりやすいです。
boolean enabled = true;
一方で、
「未設定」
「値なし」
「DB上NULL」
のような状態を区別したい場合は、
Boolean が候補になります。
Boolean enabled = null;
特にDBやJSON、 APIレスポンスなど、 外部から取得したデータを扱う場合には この違いを意識する必要があります。
FIELD NOTE
「Booleanにしたら
なんか面倒になった」
最初は
boolean で十分だと思っていたのに、
DBやAPIを扱い始めると
null が登場する。
そこで
Boolean に変更すると、
今度はnullチェックが必要になる。
これは単純に 「Booleanの方が高機能だから使えばいい」 という話ではありません。
その値に、
「未設定」という状態が本当に必要なのか。
そこを考えて型を選ぶ必要があります。
SUMMARY
Booleanとbooleanを整理する
重要なのは、 「どちらが正しいか」ではありません。
その値が、
「2状態だけなのか」
「未設定という3つ目の状態が必要なのか」
を考えることです。
Javaでは型を選ぶこと自体が、 データの意味を設計することにもつながります。