1

したがって、ウィキペディアなどによると、boolean値には次の 2 つの状態しかないはず0です1trueまたはfalse; yesまたはno; 等々...

間違っていたら訂正してください。ただし、JavaBooleanラッパーにより、開発者は と の 3 つの状態を持つことができtrueます。falsenull

それは間違っていませんか?

「ブール値はオブジェクトです」などで説明できることは知っていますが、javacが自動的に「ラップ」するとnullfalseIMHO.

私が言いたいのは、この動作により、開発者はBoolean適切なオブジェクト型の代わりに使用するため、開発者に多くの無駄なことをさせてしまうということです。

とにかく、あなたはそれについてどう思いますか?私は間違った考え方をしていますか..それとも本当に「間違っている」のでしょうか?


編集

私は何が何であるか、とnullの違いなどを知っています (私は Java で 3 年以上の経験があります)。booleanBoolean

私の要点は、Ruby のように概念自体if somethingについてです。somethingnilfalse

そして、私は Java ががらくたと言っているわけではありません。私は毎日 Java を使用しています。

4

7 に答える 7

11

nullは値がないことを表し、truefalseは明確な値です。肯定的にも否定的にも、何かを知っているか、まったく知らないかの違いです。と考えるのも一つの手です。

技術的に aBooleanができる理由は、それが値自体でnullはなくオブジェクト参照であるためです。オートボクシングが原因で混乱が生じる可能性があります。以前は、値を含むオブジェクトを手動で作成し、オブジェクトから値を手動で抽出する必要がありました。Java 5 以降、コンパイラがこれを処理します。booleanBooleanbooleanbooleanBoolean

booleanオブジェクトに含まれるの値はまたはのBooleanいずれかですが、オブジェクト変数がオブジェクトをまったく指していない可能性があります。この場合、参照の値は です。truefalsenull

booleanなぜとあなたが尋ねるかもしれない違いがあるのBooleanですか? Java では、多くの新しい言語とは異なり、プリミティブ型はクラスではなく、プリミティブはオブジェクトではありません。それらを参照渡ししたり、メソッドを呼び出したり、コレクションに入れたりする場合など、それらをそのように扱いたい場合は、それぞれのプリミティブラッパークラスにそれらをボックス化する必要があります。

于 2012-12-13T18:05:01.840 に答える
3

の 3 値の性質がBoolean適切でない場合は、使用しないでください。を使用しbooleanます。指向のインターフェイスを使用しているときに、 が必要Booleanになる場合があります。Objectそんなときは、 を使いますBoolean

  • booleanは、記述している概念を表すプリミティブ型であり、true と false の 2 つの可能な値を持つ型です。

  • Booleanタイプが違います。Object値を保持するですboolean。オブジェクトが存在しない場合、参照は null です。null のブール オブジェクトではなく、null のブール オブジェクトへの参照です。

名前は似ていますが、混同しないでbooleanくださいBoolean。それらは正当な理由で異なるタイプです。

于 2012-12-13T18:07:48.107 に答える
2

2 つの状態になる可能性のある があるため、次の場合を除きboolean、使用しても意味がありませんBoolean

  • あなたは3つの状態が必要です
  • あなたがしなければならないことを意味するAPIを使用しています。

null一般に、 a) 値が必要な場合、b) API のために必要な場合を除き、可能な場合は常にプリミティブを使用してください。

于 2012-12-13T18:07:55.643 に答える
1

あなたが暗示しているのは、ラッパーがプリミティブな「実際の」ブール値の厳密な動作を模倣する必要があるということです。それが問題です。ブール値は、概念的にはブール値と同じではありません(大文字化に注意してください)。

プリミティブ ブール値は、ウィキペディアでブール値として説明されているものを提供します。

ブール値 (java.lang.Boolean) は、表示のためだけにラッパーとは呼ばれません。概念的には、ブール値を含むオブジェクトです。したがって、ブール値への参照は参照であり、ブール値とは何の共通点もありません。したがって、プリミティブではなく、参照のルールが適用されます。

この視点を取ると、非常に単純で論理的です。

于 2012-12-13T18:11:54.960 に答える
0

booleanプリミティブラッパーとプリミティブラッパーを混同していますBoolean。確かに、またはのみでbooleanある可能性があります。truefalse

Booleanインスタンスも保持できtrueますfalse。ただし、インスタンスが存在しない場合、参照はnull初期化されていない参照と同じです。

于 2012-12-13T18:05:34.060 に答える
0

null「ここにオブジェクトがありません」という意味です。Boolean trueオブジェクトはプリミティブのラッパーですが、それでもboolean trueオブジェクトです。次のコードは、NullPointerException

public static void main(String[] args) {
  Boolean myBool = null;
  boolean primBool = myBool;

  System.out.println(primBool);
}
于 2012-12-13T18:07:58.813 に答える
0

たとえば、データベースを作成すると、以下の列を持つテーブルがあります。

Col-1 : 時間 (nvarchar)

Col-2 : 分 (nvarchar)

Col-3 : IsDay (ブール値)

時間が 18 で分が 00 の場合、 IsDay の値は何になるでしょうか? (真でも偽でもない)現時点ではnullです...

于 2012-12-13T18:19:03.920 に答える