ブール値の代わりにブール値を使用する必要があるのはいつですか? つまり、「true」または「false」のいずれかを含む必要がある変数に null 値を設定したいのはなぜでしょうか。(ほとんどの人が) 1 つの自発的な答えは、値が不明な場合です。つまり、値が真か偽かがわからない場合です。しかし、プログラミングの観点からは、ブール値を使用するとコードが壊れる可能性があると思います。したがって、プリミティブ型を使用する方がラッパーよりも優れていると思います.間違っている場合は修正してください。
8 に答える
一般的に言えば、ラッパー クラスは、オブジェクトが必要な場合や非常に優先される場合に使用されます。これらの状況以外では、プリミティブ型を使用する方がオーバーヘッドが少ないため==
、 などを使用することをお勧めします。これが頻繁に見られる 2 つ半の主要な状況があります。
- コレクション。これは現在、次のケースのサブセットですが、Java 5 より前でも Collections クラスはオブジェクトをキーと値としてのみサポートしており、これは変更されていません。
- ジェネリック。ジェネリック型は、プリミティブではなくオブジェクトでのみ機能するため、型パラメーターとして「ブール値」を使用している場合は、ラッパー クラスである必要があります。たとえば、を使用している場合は、 の代わりに
Future
を使用する必要があります。(HT @user949300)Boolean
boolean
- ORM。JPA およびその他の ORM システムは、技術的にはプリミティブ フィールドを使用できますが、オーバーヘッドが十分に高いため、実際には問題にならないため、ラッパー クラスを使用するのが通例であり、ラッパー クラス
NULL
はデータベースに存在する可能性のある値を表すことができます。 . ただし、意味的にはデフォルトの方が通常「未定義」よりも優れているため、通常はnullを禁止し、ブール値にプリミティブを使用する方が適切です。
ブール値は または のいずれtrue
かfalse
に制限されているため、コレクションまたはジェネリックで使用されることはまれです。一般的に言えば、ブール値を値として使用する場合は、Collection#contains
代わりに使用します。
ブール値には 3 つの可能な値 (null、true、false) がありますが、ブール値は (true、false) のみです。
私はプリミティブをとても好みます。ただし、ブール値は必要です。
- コレクションに入るとき
- null 値を許可する必要がある場合。私の経験では、これは主にデータベースに保存されていて、まだ読み取られていないこと、またはユーザーがまだ何らかのフォームに入力していないことを示すために null が必要な場合です。
コレクションを使用する必要がある場合はどうしますか? コレクションはプリミティブ型を保存しません。そこにオブジェクトを保存する必要があります。コレクションは非常に多くのユーティリティ api を提供するため、それらを使用する場合は、コレクションにはオブジェクトが必要になるため、ブール型オブジェクトが必要です。いつでもオートボクシングを使用できますが、オブジェクトの作成から保護され、コレクションが内部でそれを処理します。
Wrapper クラスは、オブジェクトが必要な場合、またはコレクション、キャッシュ、セッションなどにオブジェクトを格納する場合など、オブジェクトが必要な場合に使用されます (そうでない場合、JRE はプリミティブを Wrapper クラスに変換してからセカンダリに格納します)。キャッシュ)。以下のリンクはよりよく説明します:
Boolean
はオブジェクトなので、ジェネリックで使用できます。たとえば、Map<String,Boolean>
文字列 (= キー) ごとに true/false 値を格納する必要がある場合があります。はオブジェクトではないMap<String,boolean>
ため、実行できません。具体的には、のサブクラスではありません。ジェネリックはコンパイル時のラッパーであるため、クラスまたは配列型である限り、実際にはスマート キャストを使用します。しかし、それらはプリミティブになることはできません。boolean
Object
Map<Foo,Bar>
Map<Object,Object>
Foo
Bar
ブール値は、プリミティブ型のブール値に対してブール値をラップするオブジェクト/参照型です。
Boolean - 便利なメソッドをさらに取得できます。
boolean - 多くのメモリを節約します。しかし、 を使用する場合Boolean.valueOf(value) of new Boolean(value)
、それは原因ではありません。
このようなプリミティブとオブジェクト間の変換は、ボックス化/ボックス化解除として知られています。
詳細については、以下のリンクをクリックしてください。
http://javaeye.wordpress.com/2008/06/17/boxing-and-unboxing-conversion/
http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html