C++では、windows.h FALSE
は、いくつかの特殊なロジックの場合に意味のある整数として定義されますが、Java Java.lang.Boolean.FALSE
は、ブール値として定義され、falseに割り当てられますpublic static final Boolean FALSE
そして私は何人かの人々がそれを使うのを見てきました。
私の質問:false
とBoolean.FALSE
の間にパフォーマンスの違いはありますか?一般的になぜ人々は行き、Boolean.FALSE
?
http://docs.Oracle.com/javase/7/docs/api/Java/lang/Boolean.html を参照してください。
_Boolean.TRUE
_および_Boolean.FALSE
_はboolean
ではなく、Boolean
です。これらは、Boolean
値boolean
およびtrue
に対応する2つのfalse
ラッパーオブジェクトの静的インスタンスです。
Boolean
はenum
に似ています。 TRUE
およびFALSE
インスタンスは Boolean.valueOf()
によって返されるインスタンスです。
プリミティブとラッパーのパフォーマンスについては、あなたが心配する必要があるだろうという違いはありません。 TRUE
およびFALSE
静的インスタンスはパフォーマンスに少し役立ちます。Javadocは、その理由から、Boolean.valueOf()
ではなくnew Boolean(...)
を使用することをお勧めします。 true
およびfalse
ブール値は少し「低いレベル」ですが、それらをBoolean
(boolean
ではなく)に保存している場合はとにかくそれは無関係です。
コードにとって最も意味のあるものを使用し、読みやすくする必要があります(そして、プリミティブ型とラッパー型のようなマイクロ最適化について考える道をたどらないでください)。 Boolean
を使用している場合は、オブジェクトの値を使用します。 boolean
を使用している場合は、プリミティブ値を使用します。 Boolean
とboolean
を決定する場合は、より適切なものを使用します(たとえば、Boolean
はnull
にすることができます。ジェネリック型パラメーターにはプリミティブ型を使用できません。一方、boolean
はnull
になりますnever同じように役立ちます)。
また、自動ボクシングはプリミティブ型をこれらの2つの静的Boolean
インスタンスのいずれかに変換することにも注意してください。例:
_Boolean a = true;
assert(a == Boolean.TRUE);
_
余談ですが、あなたがそれを言及したので:FALSE
は_windows.h
_で2つの理由で定義されています:1)_windows.h
_はCのみの日以来使用されており、Cはネイティブのbool
タイプ、および2)既知の明示的なサイズと値を使用してデータタイプと値を定義することは、従来のMicrosoftの慣習です。 DLL境界を越えて(この質問の範囲を超えて)Windows API関数にデータを渡すため、および「true」と「false」の異なる表現を持つ他の言語と統合するため。それは完全に無関係ですJavaでの_Boolean.FALSE
_の理由に。
false
はプリミティブであり、Boolean.FALSE
はオブジェクトなので、実際には比較できません。
次のように、false
をBoolean
変数に代入すると、
Boolean b = false;
Javaの自動ボクシングは、プリミティブをオブジェクトに変換するために発生するため、false
値は失われ、最終的にBoolean.FALSE
とにかく。
パフォーマンスの点では、プリミティブ変数を使用すると、ラッパーBoolean
オブジェクトを使用してわずかにパフォーマンスが向上しますが、「パフォーマンス」ではなく、可読性と基本的な設計の決定に基づいて選択する必要があります。
Boolean
は、トライステート変数が必要なときに便利です。
また、この オートボクシングとアンボクシングのチュートリアル 、および 動作のルール も確認してください。
false
はプリミティブ型boolean
の値であり、Boolean.FALSE
は参照型Boolean
の変数であるため、これは非常に奇妙な質問です。その値は、内部のブール状態がBoolean
であるfalse
型のオブジェクトへの参照です。
パフォーマンスに関しては、Boolean.FALSE
はBoolean
オブジェクトを返します。これにより、より柔軟に作業できるようになります。
プリミティブの代替は、より少ないメモリを使用します
Boolean
は、ブールのプリミティブ型のラッパークラスであり、intのIntegerと同じです。
ブール値には、プリミティブ型boolean
を操作する多くのメソッドがあります
http://docs.Oracle.com/javase/6/docs/api/Java/lang/Boolean.html
Boolean a = null;
if (a) {
// NullPointerException
}
if (a != false) {
// NullPointerException
}
// Caution, comparing by reference, meaning 2 Booleans with same value could be different
if (a != Boolean.FALSE) {
System.out.println("But this one works");
}
まず、これが不明確な場合は、Javaで数値を暗黙的にブール値にキャストすることはできません。たとえば、次のようにコンパイルすることはできません。
int a = 1;
if(a){
//something, something
}
次に、パフォーマンスに関する考慮事項です。常にトレードオフがあります。
プリミティブ型boolean
を使用する場合、true
またはfalse
(明らかにバイトエンコード)のvalueを直接使用しているため、パフォーマンスが向上するはずです。
オブジェクトタイプBoolean
を使用すると、変数/フィールドに値が保持されますが、その値は実際にはオブジェクトへの参照であるため、すぐには使用できず、パフォーマンスが低下する可能性があります。もちろん、このペナルティはほとんどの場合重要ではありません。また、タイムクリティカルなアプリケーションを開発している場合は、おそらくJava :)を使用していません。それでも、オブジェクト型を使用すると、開発プロセスとユースケース実装の安全性にいくつかの利点がもたらされる可能性があります(たとえば、これによりnullが許可されます。これは、JPAエンティティをリレーショナルテーブルにマップし、nullを許可するビット型列がある場合に重要です。オブジェクトタイプの方が適している1つのシナリオ)。
最後に、ボックス化/ボックス化解除に注意してください。これにより、開発者は、boolean
- typed変数が期待されるほとんどすべての場所(およびその逆)でBoolean
- typed変数を使用できます。