Java boolean
はtrue
およびfalse
の値を許可し、Booleanはtrue
、false
、およびnull
を許可します。 boolean
sをBoolean
sに変換し始めました。これは、次のようなテストでクラッシュを引き起こす可能性があります
Boolean set = null;
...
if (set) ...
テスト中
if (set != null && set) ...
不自然でエラーが発生しやすいようです。
Null変数でBoolean
sを使用するのが便利な場合はいつですか?そうでない場合、ラップされたオブジェクトの主な利点は何ですか?
更新:非常に多くの貴重な回答があったので、その一部を自分の回答にまとめました。私はせいぜいJavaの中間者なので、役に立つと思うものを見せようとしました。質問は「誤って表現されている」ことに注意してください(ブール値は「null値を持つことはできません」)
できる限り、boolean
ではなくBoolean
を使用してください。これにより、多くのNullPointerException
sが回避され、コードがより堅牢になります。
Boolean
は便利です、たとえば
MessageFormat.format()
などのメソッドを使用する場合。その意味があいまいであいまいなので、私はBoolean
をほとんど使用しません。基本的に、3ステートロジック(true、false、またはunknown)があります。時々それを使用すると便利ですユーザーに2つの値の選択肢を与えたが、ユーザーはまったく答えなかったため、その情報を本当に知りたい(考えてみてください:NULLable database column)。
boolean
からBoolean
に変換する理由はありません。余分なメモリオーバーヘッド、NPEの可能性、および入力の減少が発生するためです。通常、Boolean
を使用して生活を少し楽にするために、厄介な BooleanUtils.isTrue()
を使用します。
Boolean
が存在する唯一の理由は、Boolean
型のコレクションを持つ機能です(ジェネリックでは、boolean
、および他のすべてのプリミティブは許可されません)。
うわー、一体何?それは私だけですか、これらの答えはすべて間違っているか、少なくとも誤解を招いていますか?
ブールクラスは、ブールプリミティブ型のラッパーです。このラッパーを使用すると、オブジェクトまたはジェネリックを受け入れるメソッドでブール値を渡すことができます。すなわちベクトル。
ブールオブジェクトは、決してnullの値を持つことができません。ブールへのreferenceがnullの場合、ブールが作成されなかったことを意味します。
これは役に立つかもしれません: http://grepcode.com/file/repository.grepcode.com/Java/root/jdk/openjdk/6-b14/Java/lang/Boolean.Java
NULLブール参照は、他のNULL参照がある類似のロジックをトリガーするためにのみ使用する必要があります。 3ステートロジックに使用するのは面倒です。
編集:Boolean a = true;
は誤解を招くステートメントであることに注意してください。これは本当にBoolean a = new Boolean(true);
に近いものに相当します。ここでオートボクシングをご覧ください: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#Autoboxing
おそらく、これが混乱の多くの原因です。
EDIT2:以下のコメントをお読みください。これを組み込むために私の答えを再構築する方法のアイデアがある人は、そうしてください。
3つの簡単な理由があります。
true
、false
、またはnull
xsd:boolean
で宣言されたXMLスキーマのxsd:nillable="true"
値を表すList<Boolean>
-List<boolean>
は使用できません質問に対する回答:回答から多くのことを学んだので、自分の質問に答えることは有益だと思いました。この回答は、私のような、問題を完全に理解していない人を助けることを目的としています。間違った言語を使用している場合は修正してください。
true
およびfalse
とは根本的に異なります。オブジェクトへのポインタがないことです。したがって、ブール値が3値であると考えるのは根本的に間違っていますブールの構文は省略されており、参照がオブジェクトを指しているという事実を隠しています。
Boolean a = true;
true
がオブジェクトであるという事実を隠します。他の同等の割り当ては次のとおりです。
Boolean a = Boolean.TRUE;
または
Boolean a = new Boolean(true);
短縮構文
if (a) ...
は、他のほとんどの割り当てとは異なり、がオブジェクト参照またはプリミティブである可能性があるという事実を隠しています。オブジェクトの場合、null
をテストしてNPEを回避する必要があります。私にとっては、平等性テストがある場合、これを覚えるのは心理的に簡単です:
if (a == true) ...
nullをテストするように求められる場合があります。したがって、短縮形はa
がプリミティブの場合にのみ安全です。
私自身の推奨事項は次のとおりです。
Boolean
になる可能性があるため、メソッドからnull
を返さないでください。 boolean
のみを返します。Boolean
は、コンテナ内の要素のラップ、またはオブジェクトが必要なメソッドの引数にのみ使用しますプリミティブのラッパークラスは、オブジェクトが必要な場合に使用できます。コレクションは良いサンプルです。
何らかの理由でboolean
のシーケンスをArrayList
に保存する必要があると想像してください。これは、boolean
をBoolean
にボクシングすることで実行できます。
これについていくつかの言葉があります here
ドキュメントから:
Javaプログラマーが知っているように、int(または他のプリミティブ値)をコレクションに入れることはできません。コレクションはオブジェクト参照のみを保持できるため、プリミティブ値を適切なラッパークラス(intの場合は整数)にボックス化する必要があります。オブジェクトをコレクションから取り出すと、入れた整数を取得します。 intが必要な場合は、intValueメソッドを使用して整数のボックス化を解除する必要があります。このボックス化とボックス化解除はすべて苦痛であり、コードが乱雑になります。オートボクシングおよびアンボクシング機能は、プロセスを自動化し、痛みと混乱を取り除きます。
http://docs.Oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
場合によっては、すでに値を設定しているかどうかのブール値フィールドを区別するメカニズムが必要だと思います。
Boolean
ラッパーは、true
およびfalse
以外に値が割り当てられたかどうかを確認する場合に役立ちます。次の3つの状態があります。
null
である未定義boolean
には2つの状態しかありません。
上記の違いは、Boolean
、True
、またはFalse
を持つことができるNull
値のリストで役立ちます。
上記のすべての良い答えについて、JavaサーブレットのHttpSession
クラスで具体的な例を挙げます。この例があなたがまだ持っているかもしれないいくつかの質問を明確にするのに役立つことを願っています。
セッションの値を保存および取得する必要がある場合は、setAttribute
(String、Object)およびgetAttribute
(String、Object)メソッドを使用します。そのため、ブール値の場合、httpセッションに格納する場合はブールクラスを使用する必要があります。
HttpSession sess = request.getSession(false);
Boolean isAdmin = (Boolean) sess.getAttribute("admin");
if (! isAdmin) ...
属性値が設定されていない場合、最後の行でNullPointerException
が発生します。 (これが私をこの投稿に導いた理由です)。したがって、使用するかどうかに関係なく、3つの論理状態はここにあります。
ブール値は、3つの状態が必要な場合に非常に役立ちます。ソフトウェアテストのように、Testが渡された場合はtrueを送信し、失敗した場合はfalseを送信し、テストケースが中断した場合はテストケースが実行されないことを示すnullを送信します。
ブールラッパーの** null **値には多くの用途があります! :)
たとえば、フォームに「ニュースレター」という名前のフィールドがあり、ユーザーがサイトのニュースレターを希望するかどうかを示します。ユーザーがこのフィールドの値を選択しない場合、その状況にデフォルトの動作を実装することができます(送信しますか?送信しませんか?再度質問しますか?など)。明らかに、設定されていない(または選択されていない、または** null **)は、trueまたはfalseと同じではありません。
ただし、「not set」がモデルに適用されない場合は、ブールプリミティブを変更しないでください;)
ブール要素の厳密な定義では、2つの値のみがあります。完璧な世界では、それは本当でしょう。現実の世界では、要素が欠落しているか不明である場合があります。通常、これにはユーザー入力が含まれます。画面ベースのシステムでは、編集によって強制される可能性があります。データベースまたはXML入力のいずれかを使用するバッチワールドでは、要素が簡単に欠落する可能性があります。
したがって、私たちが住んでいる非完全な世界では、ブールオブジェクトは、欠落または不明な状態をヌルとして表すことができるという点で優れています。結局のところ、コンピューターはすべての可能な状態を考慮し、例外をスローしてそれらを処理する必要がある現実世界をモデル化するだけです(ほとんどの場合、例外をスローすることが正しい応答になるユースケースがあるため)。
私の場合、入力XMLに要素が欠落している可能性があり、ブール値に割り当ててブール値に割り当ててからtrueまたはfalseテストを使用する前にnullをチェックできるため、ブールオブジェクトが完璧な答えでした。
ちょうど2セントです。
ブール値の主な目的はヌル値です。 null値は、プロパティが未定義であることを示します、たとえば、データベースのnull許容列を取得します。
すべてをプリミティブなブール値からラッパーブール値に変換する必要がある場合は、次を使用して古いコードをサポートできます。
Boolean set = Boolean.FALSE; //set to default value primitive value (false)
...
if (set) ...
最良の方法は、ブール値を完全に回避することです。すべてのブール値は、コードの他の場所に条件文があることを意味するためです( http://www.antiifcampaign.com/ およびこの質問を参照してください:- ifステートメントなしでアルゴリズムを記述できますか? )。
ただし、実際には時々ブール値を使用する必要がありますが、すでに自分でわかっているように、ブール値の処理はエラーが発生しやすく、面倒です。したがって、可能な限りブール値を使用することをお勧めします。これからの例外は、nullを許可するブール列を持つレガシーデータベースかもしれませんが、マッピングでもそれを隠そうとします。