2017-01-17 15 views

答えて

3

自動ボクシングによる混乱です。コードははこのように、あなたが(真のようにその初期値を持つ)新しいBooleanオブジェクトを指すように参照テストを変更している

として
Boolean test = new Boolean(false); 
test = new Boolean(true); 

を読まれるべきです。元のブール型オブジェクトは更新されていません。実際には、実際の値を更新する方法はありません。したがって、不変です。

+0

説明をいただきありがとうございます。 falseの元の論理値はメモリ空間に保持され続けますか?私が書いたコードは良い習慣ではないのですか? –

+1

ようこそ。はい、それはスペースを保持し続けますが、ガベージコレクションの対象となるため、JVMはそれを処理します。しかし、それは悪い習慣ではありません。あなたがしたことはまったく問題ありません。値が制限されたオブジェクト(boolean、shortintなど)の場合、JVMは値をキャッシュします。将来誰かがtest2 = falseという参照を作成した場合、JVMは新しいメモリを割り当てる代わりに、このメモリへの参照を指すようになります。一般的に、コードの可読性に常に重点を置いて、JVMにパフォーマンス/メモリーの世話をさせてください。 – DeepakV

1

ブール値がJavaで不変の場合、どのようにしてテストをfalseからtrueに変更できますか?私に間違いを与えてはいけませんか?

trueにブール型の変数testを割り当てるため、エラーは発生しません。 System.out.println()の出力はtrueとなります。

ブールは、あなたがそれの値を変更し、新しいMEM配分を割り当てることができ、文字列のような不変ですが、最初の参照値を持つメモリの割り当てに残っています。

1

「割り当て可能性」は、不変性とは完全に別の概念です。割り当て可能性はフィールドと変数のプロパティですが、不変性はタイプのプロパティです。

Boolean(Javaのすべてのオブジェクトと同様)は参照型です。本質的に、それはポインタです。私たちが不変性について話すとき、個々のオブジェクトが変異する能力を指しています。ポインター自体をいつでも別のオブジェクトを指すように(またはnullに)変更することができ、オブジェクトの不変性に影響しません。

さらに簡単な例では、

String greeting = "Hello, world."; 
greeting = null; 

文字列はJavaで不変であるので、(「こんにちは、世界」テキストに対応するデータを含む)を、元のStringオブジェクトはまだ、変わらず存在するだろう。私たちがやったことは、どこか別のところでポインタポイントになります。

変数またはフィールドがfinalと宣言されている場合、その変数に再割り当てすることはできなくなりますが、その型が変更可能な場合でも変更できます。これは本質的にあなたの状況の逆です(最終的ではないフィールド/変数を持つ不変型)。

この違いは、C/C++のconstポインタとconst-to-constの違いと本質的に同じです。

関連する問題