1

今日、私は本当に私を混乱させた Java の問題に対処しました。次のコードがあります。

List<ObjectXY> someList = obj.getListOfObjectsXY(); // getter returns 2 elements
someList.add(new ObjectXY());

obj.getListOfObjectsXY(); // getter now returns 3 elements

リストに要素を追加すると、ゲッターが何らかの形で上書きされます。someListこれは、この場合、ゲッターの結果に対する参照のように機能するためですか? または、他に何がこの効果を引き起こしますか?

別のリストを使用して、次のコードで問題を解決しました。

List<ObjectXY> someList = obj.getListOfObjectsXY(); // result: 2 elements

List<ObjectXY> someOtherList = new ArrayList<ObjectXY>();
someOtherList.addAll(someList);
someOtherList.add(new ObjectXY());

obj.getListOfObjectsXY(); // result: 2 elements

しかし、Javaがこのように動作するとは思っていなかったので、まだ混乱しています。誰が私が間違っていたのか、なぜそうなのか説明できますか?

前もって感謝します!

4

3 に答える 3

4

実際、返された結果は、内部で使用しているものと同じオブジェクトへの参照のコピーにすぎません。呼び出し元がオブジェクトを変更しないことを期待すると、エラーが発生しやすくなります。

1 つの解決策は、リストをラップする変更不可能なリストへの参照を返すことです。を参照してくださいCollections.unmodifiableList()。getter 呼び出し元はリストを変更できません。

于 2013-08-17T15:40:09.773 に答える
2

これは、この場合、someList が getter の結果に対する参照のように機能するためでしょうか。

はい。あなたが受け取ったリストは、あなたが持っていたのと同じ、元のリストへの参照にすぎません。この変数に加えられた変更は、元のリストに反映されます。

リストの値を新しいリストに追加することで、新しいオブジェクトを明示的に構築したため、それらは分離されます。

于 2013-08-17T15:31:04.120 に答える
0

あなたの場合、obj.getListOfObjectsXY()毎回同じオブジェクトが返され、Java オブジェクト参照は値渡しです。したがって、を実行するsomeList.add(new ObjectXY());と、実際にはオブジェクト someList のプロパティが設定されobj.getListOfObjectsXY()ます。

後者の場合、someList を someOtherList にコピーするだけです。次に、同じ someOtherList にもう 1 つの要素を追加しましたが、someList には追加しませんでした。したがって、obj.getListOfObjectsXY(); で 2 つの要素を取得します。完全に有効です。

于 2013-08-17T15:35:22.927 に答える