161

Javabooleanでは と の値が許可されますがtruefalseブール値ではtruefalse、およびが許可されますnullbooleans をsに変換し始めましたBoolean。これにより、次のようなテストでクラッシュが発生する可能性があります。

Boolean set = null;
...
if (set) ...

テスト中

if (set != null && set) ...

不自然でエラーが発生しやすいようです。

Booleannull 値で sを使用すると便利な場合はありますか? ない場合、ラップされたオブジェクトの主な利点は何ですか?

更新: 非常に多くの貴重な回答があったため、その一部を自分の回答にまとめました。私はせいぜい Java の中級者なので、役に立つと思うものを紹介しようとしました。質問は「誤った言い回し」であることに注意してください(ブール値は「null値を持つことはできません」)が、他の人が同じ誤解をしている場合に備えて残しました

4

14 に答える 14

249

できる限り毎回booleanではなく使用してください。Booleanこれにより、多くの が回避さNullPointerExceptionれ、コードがより堅牢になります。

Booleanたとえば、便利です

  • ブール値をコレクション (リスト、マップなど) に格納する
  • null 許容ブール値 (たとえば、データベースの null 許容ブール値列から取得) を表します。このコンテキストでは、null 値は「真か偽かがわからない」ことを意味する場合があります。
  • メソッドが引数としてオブジェクトを必要とするたびに、ブール値を渡す必要があります。たとえば、リフレクションや のようなメソッドを使用する場合MessageFormat.format()
于 2012-06-25T07:53:24.377 に答える
59

Booleanそのセマンティクスがあいまいであいまいであるため、私はほとんど使用しません。基本的に、真、偽、または不明の 3 状態のロジックがあります。たとえば、ユーザーに 2 つの値の選択肢を与え、ユーザーがまったく答えず、その情報を本当に知りたい場合などに使用すると便利です (NULL 可能なデータベース列を考えてください)。

余分なメモリ オーバーヘッド、NPE の可能性、タイピングの減少が生じるため、 からbooleanに変換する理由はありません。通常、私は自分の生活を少し楽にするためにBoolean気まずいものを使用します。BooleanUtils.isTrue()Boolean

が存在する唯一の理由は、タイプBooleanのコレクションを持つことができることです (ジェネリックは、他のすべてのプリミティブと同様にBoolean許可されていません)。boolean

于 2012-06-25T07:53:16.100 に答える
33

うわー、一体何?それは私だけですか、それともこれらすべての答えが間違っているか、少なくとも誤解を招くものですか?

ブールクラスは、ブールプリミティブ型のラッパーです。このラッパーの使用は、オブジェクトまたはジェネリックを受け入れるメソッドでブール値を渡すことができるようにすることです。つまり、ベクトル。

ブールオブジェクトの値をnullにすることはできません。ブール値への参照が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:以下のコメントをお読みください。これを組み込むために私の答えを再構築する方法について誰かが考えている場合は、そうしてください。

于 2012-06-25T14:42:55.583 に答える
26

3 つの簡単な理由があります。

  • データベースのブール値を表しtrue、 、falseまたはnull
  • xsd:booleanで宣言されたXML スキーマの値を表すxsd:nillable="true"
  • ジェネリック型を使用できるようにする: List<Boolean>- 使用できませんList<boolean>
于 2012-06-25T07:52:39.847 に答える
11

自分の質問への回答:回答から多くのことを学んだので、自分の質問に回答することが役立つと思いました。この回答は、私のように、問題を完全に理解していない人を支援することを目的としています。間違った言語を使用している場合は、訂正してください。

  • truenullの「値」は値ではなく、基本的におよびとは異なりfalseます。オブジェクトへのポインタがないことです。したがって、ブール値が3値であると考えるのは根本的に間違っています
  • ブールの構文は省略されており、参照がオブジェクトを指しているという事実を隠しています。

    Boolean a = true;

trueオブジェクトであるという事実を隠します。他の同等の割り当ては次のとおりです。

Boolean a = Boolean.TRUE;

また

Boolean a = new Boolean(true);
  • 省略構文

    if (a) ...

は他のほとんどの割り当てとは異なり、がオブジェクト参照またはプリミティブである可能性があるという事実を隠します。オブジェクトの場合、nullNPEを回避するためにテストする必要があります。私にとって、平等テストがある場合、これを覚えるのは心理的に簡単です。

if (a == true) ...

nullをテストするように求められる場合があります。したがって、短縮形はa、がプリミティブである場合にのみ安全です。

私自身のために、私は今、推奨事項を持っています:

  • 3値論理にはnullを使用しないでください。trueとfalseのみを使用してください。
  • Booleanメソッドから戻ることは絶対にしないでnullください。のみ返しbooleanます。
  • Booleanコンテナ内の要素のラップ、またはオブジェクトが必要なメソッドへの引数にのみ使用してください
于 2012-06-26T17:19:23.970 に答える
10

プリミティブのラッパー クラスは、オブジェクトが必要な場所で使用できます。コレクションは良い例です。

boolean何らかの理由で のシーケンスをに格納する必要があると想像してください。これは でボックス化するArrayListことで実行できます。booleanBoolean

ここでこれについていくつかの言葉があります

ドキュメントから:

Java プログラマーなら誰でも知っているように、int (またはその他のプリミティブ値) をコレクションに入れることはできません。コレクションはオブジェクト参照しか保持できないため、プリミティブ値を適切なラッパー クラス (int の場合は Integer) にボックス化する必要があります。コレクションからオブジェクトを取り出すと、入れた整数が得られます。int が必要な場合は、intValue メソッドを使用して Integer をアンボックスする必要があります。このボックス化とボックス化解除はすべて面倒であり、コードが乱雑になります。自動ボックス化およびボックス化解除機能により、プロセスが自動化され、手間と煩雑さが解消されます。

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

于 2012-06-25T07:52:54.437 に答える
3

場合によっては、すでに値が設定されているかどうかをブールフィールドに区別するメカニズムが必要になると思います。

于 2012-06-25T07:52:56.857 に答える
3

Booleantruewrapper は、と とは別に、値が割り当てられているかどうかを確認したい場合に便利ですfalse。次の 3 つの状態があります。

  • 真実
  • 間違い
  • どちらが定義されていませんnull

一方boolean、状態は 2 つしかありません。

  • 真実
  • 間違い

上記の違いは、 、またはBooleanを持つことができる値のリストで役立ちます。TrueFalseNull

于 2012-06-25T07:53:20.460 に答える
1

Boolean ラッパーの **null** 値には多くの用途があります。:)

たとえば、ユーザーがサイトからのニュースレターを希望するかどうかを示す「ニュースレター」という名前のフィールドをフォームに含めることができます。ユーザーがこのフィールドで値を選択しない場合は、その状況に対するデフォルトの動作を実装することをお勧めします (送信する?送信しない?、再度質問する?など)。明らかに、設定されていない (または選択されていない、または **null**) ことは、true または false と同じではありません。

ただし、「未設定」がモデルに適用されない場合は、ブール値プリミティブを変更しないでください ;)

于 2012-06-26T22:24:29.227 に答える
1

ブール値は、3 つの状態が必要な場合に非常に役立ちます。ソフトウェア テストと同様に、テストに合格した場合は true を送信し、失敗した場合は false を送信し、テスト ケースが中断された場合は null を送信します。これは、テスト ケースが実行されなかったことを示します。

于 2016-01-11T17:27:27.070 に答える
1

Boolean の主な目的は null 値です。Null 値は、そのプロパティが undefinedであることを示します。たとえば、データベースの null 許容列を取得します。

すべてをプリミティブブール値からラッパーブール値に変換する必要がある場合は、次のコードを使用して古いコードをサポートできます。

Boolean set = Boolean.FALSE; //set to default value primitive value (false)
...
if (set) ...
于 2012-06-25T07:54:08.950 に答える