なぜ次のことが起こるのかを知る必要があります。このコード (最後の 2 つのブロック) では、まったく同じ出力が期待されますが、ローカル オブジェクト (リスト内のものへの単なる参照ですよね?) は古い状態にありますが、リストを更新しました。ゲームコードに同様のコピー手順があるため、バグがあります(タイルベースのオブジェクトは位置を交換するので、参照を交換するだけではいけないと思いました...)
例:
package game;
import java.util.ArrayList;
public class Tester {
private String s;
private Foo foo;
public Tester(String s, String f) {
this.s = s;
this.foo = new Foo(f);
}
class Foo {
private String f;
public Foo(String f) {
this.f = f;
}
}
@Override
public String toString() {
return foo.f + ":" + s;
}
public void swap(Tester other) {
String tempS = this.s;
Foo tempFoo = this.foo;
this.s = other.s;
this.foo = other.foo;
other.s = tempS;
other.foo = tempFoo;
}
public static void main(String[] args) {
ArrayList<Tester> test = new ArrayList<Tester>();
test.add(new Tester("First", "1"));
test.add(new Tester("Second", "2"));
System.out.println("After initializing list");
for (Tester t : test) {
System.out.println(t);
}
Tester first = test.get(0);
Tester second = test.get(1);
Tester tmp = first;
first = second;
second = tmp;
System.out.println("\nAfter temps");
System.out.println(first);
System.out.println(second);
System.out.println("\nList changed after temps?");
for (Tester t : test) {
System.out.println(t);
}
System.out.println("\nAfter swap");
first.swap(second);
System.out.println(first);
System.out.println(second);
System.out.println("\nList after swap");
for (Tester t : test) {
System.out.println(t);
}
}
}
そして出力:
After initializing list
1:First
2:Second
After temps
2:Second
1:First
List changed after temps?
1:First
2:Second
After swap
1:First
2:Second
List after swap
2:Second
1:First
私は少し不明確だったと思います.私は常に最初に2番目(オブジェクト)を印刷するので、「スワップ後」は「スワップ後のリスト」とまったく同じように見えるはずです.リストはローカルオブジェクトのスワップ後に変更されました,ローカルオブジェクト(繰り返しますが、リスト内のものへの単なる参照ですか?) 持っていません。
答えのコメントへ:私の混乱が解消され、問題が解決されたときに、オブジェクトへのリストの実際の参照を取得できるかどうかを尋ねていたので、それを別のものに向けると、リストも自動的にそれは別のことです。以下の例では、最初に属性を持つFoo a
オブジェクトを指していますが、この参照は から取得しました。これで、リストを指すと、引き続き が指されます。
Foo
A
list.get()
new Turtles()
Foo with A
タートルを指すと、配列リストがタートルを指すように、「ハード」リファレンスを望んでいました。
これによりスワッピングが簡単になりますが、これを行うことができるリストを実装する方法はまだわかりません (可能な場合)。これは、私のゲームの特定のニーズに非常に適しています。