0

以下のコードでは、StringBuilder のインスタンスは 1 つしかなく、test2 と test3 は実際には元のインスタンスを指しています。new StringBuilder()

StringBuilder test = new StringBuilder("test");
StringBuilder test2;
StringBuilder test3;
test2 = test;
test3 = test2;

したがって、test3 を追加すると、元のテストが追加されます。

String は不変であることは理解していますが、以下のコードを使用してください

String test = new String("test");
String test2;
String test3;
test2=test;
test3=test2;

同じ論理的推論を使用すると、まったく同じように動作するはずですが、 test=test2test3を変更しても test とは何の関係もありません。StringBuilder のように動作する独自の単純なバイトクラスを作成し、String のように動作するものを作成したいとします等号?私が与えた2つの例の間で test=test2 が論理的に一貫している方法がわかりません。実際、私には予想外に非論理的に見えます。2 つのクラス間で実際にこの違いが生じるのは、どのコード行ですか?test2=new testtest3 = new test2

StringBuilder のインスタンスで等号を使用すると、インスタンスが渡されますが、String のインスタンスで等号を使用すると、魔法のように新しいインスタンスが作成されます。等号がこのようにどのように動作するかを決定するのは、クラスのどのコード行ですか? 実際には等号の意味が変わるので、私はこれが好きではないので、少なくともどのコードが等号の定義を変更するかを知りたいです。

4

1 に答える 1

2

2つのクラス間で実際にこの違いを生むコード行はどれですか

あなたが示していないコード行。test3にとして追加するにstringは、追加の割り当てを実行します。

test3 = test3 + "abc";

(ここで割り当てを実行しない場合、新しく生成されstringたものは参照を保持していないため、すぐにガベージ コレクションの対象になります)

test3として追加するにはStringBuilder、追加の割り当てはありません。

test3.Append("abc");

StringBuilder のように動作する独自の単純なバイト クラスと、String のように動作するクラスを作成したいとします。

のようなクラスを作成するには、 のようなStringBuilder「変更」メソッドAppend()が呼び出されたときに内部状態を変更するクラスを作成します。のようなクラスを作成するには、「変更」メソッドによって作成された更新された状態を含むクラスの新しいインスタンスをString作成するクラスを作成します。そのようなメソッドは、自身の内部状態を更新しません。

これはすべて、不変クラスの実装に関するものです。コンパイラの魔法はありません。これは単なる設計上の決定です。

于 2013-06-10T06:57:42.487 に答える