以下のコードはtrueを出力します。ブール値がJavaで不変の場合、このブール値をどのように変更できますか?
public static void main(String[] args) {
Boolean test = false;
test = true;
System.out.println(test);
ブール値がJavaで不変の場合、どのように偽から真にテストを変更できますか?私に間違いを与えてはいけませんか?
以下のコードはtrueを出力します。ブール値がJavaで不変の場合、このブール値をどのように変更できますか?
public static void main(String[] args) {
Boolean test = false;
test = true;
System.out.println(test);
ブール値がJavaで不変の場合、どのように偽から真にテストを変更できますか?私に間違いを与えてはいけませんか?
自動ボクシングによる混乱です。コードははこのように、あなたが(真のようにその初期値を持つ)新しいBooleanオブジェクトを指すように参照テストを変更している
としてBoolean test = new Boolean(false);
test = new Boolean(true);
をを読まれるべきです。元のブール型オブジェクトは更新されていません。実際には、実際の値を更新する方法はありません。したがって、不変です。
ブール値がJavaで不変の場合、どのようにしてテストをfalseからtrueに変更できますか?私に間違いを与えてはいけませんか?
true
にブール型の変数test
を割り当てるため、エラーは発生しません。 System.out.println()
の出力はtrue
となります。
ブールは、あなたがそれの値を変更し、新しいMEM配分を割り当てることができ、文字列のような不変ですが、最初の参照は偽値を持つメモリの割り当てに残っています。
「割り当て可能性」は、不変性とは完全に別の概念です。割り当て可能性はフィールドと変数のプロパティですが、不変性はタイプのプロパティです。
Boolean
(Javaのすべてのオブジェクトと同様)は参照型です。本質的に、それはポインタです。私たちが不変性について話すとき、個々のオブジェクトが変異する能力を指しています。ポインター自体をいつでも別のオブジェクトを指すように(またはnullに)変更することができ、オブジェクトの不変性に影響しません。
さらに簡単な例では、
String greeting = "Hello, world.";
greeting = null;
文字列はJavaで不変であるので、(「こんにちは、世界」テキストに対応するデータを含む)を、元のStringオブジェクトはまだ、変わらず存在するだろう。私たちがやったことは、どこか別のところでポインタポイントになります。
変数またはフィールドがfinal
と宣言されている場合、その変数に再割り当てすることはできなくなりますが、その型が変更可能な場合でも変更できます。これは本質的にあなたの状況の逆です(最終的ではないフィールド/変数を持つ不変型)。
この違いは、C/C++のconstポインタとconst-to-constの違いと本質的に同じです。
説明をいただきありがとうございます。 falseの元の論理値はメモリ空間に保持され続けますか?私が書いたコードは良い習慣ではないのですか? –
ようこそ。はい、それはスペースを保持し続けますが、ガベージコレクションの対象となるため、JVMはそれを処理します。しかし、それは悪い習慣ではありません。あなたがしたことはまったく問題ありません。値が制限されたオブジェクト(boolean、shortintなど)の場合、JVMは値をキャッシュします。将来誰かがtest2 = falseという参照を作成した場合、JVMは新しいメモリを割り当てる代わりに、このメモリへの参照を指すようになります。一般的に、コードの可読性に常に重点を置いて、JVMにパフォーマンス/メモリーの世話をさせてください。 – DeepakV