2012-02-20 5 views
1

現在、私はを持っています。ここで、Waypointは、x/yグリッド内の位置を表すために使用される単純なクラスです。今私は、あるメソッドで常に同じインスタンスのWaypointオブジェクトを使用していることに気づきましたが、私はその値を変更し続けます。要素のコピーをarraylistに保存するにはどうすればよいですか?

したがってWaypoint WPX = 0, Y = 0に初期化され、それをArrayListに追加すると、正確には何が保存されますか? WP要素またはその値を保持するコピーのみ?言い換えれば、WPの値をインクリメントしてArrayListに保存すると、ArrayListの位置0と1の要素はまったく同じになりますか?

はいの場合、新しいinstanceを毎回作成することなく、Waypoint要素のコピーを作成して保存する "簡単な方法"がありますか?

ありがとうございます!

+0

コードを表示できますか? –

+0

*はいの場合、新しいインスタンスを毎回作成する必要なしに、ウェイポイント要素のコピーを作成して保存するための「簡単な」方法がありますか?*これは自己矛盾したステートメントではありませんか?あなたはコピーを作成せずにコピーを作成したいですか?あるいは、あなたは単に 'new'キーワードを使うことを嫌っていますか? –

答えて

1

Javaは参照によって動作しますので、Waypointオブジェクトは明示的にクローンされていなければ同じです。

参照を保持している場合は、それらの値がリスト内の同じオブジェクトに反映されている間に値を簡単に変更できます。両方が同じインスタンスを参照しているからです。

これはあなたが必要とする動作が表示されます:

static class Pair 
{ 
    int x,y; 

    public Pair(int x, int y) { this.x = x; this.y = y; } 
} 

public static void main(String[] args) 
{ 
    java.util.ArrayList<Pair> pairs = new java.util.ArrayList<Pair>(); 
    Pair p = new Pair(0,0); 
    pairs.add(p); 
    p.x = 20; p.y = 40; 
    System.out.println(pairs.get(0).x+" "+pairs.get(0).y); 
} 

あなたは、あなたが期待するような出力が"20 40"であることがわかります。

ここから開始するウェイポイントから新しいウェイポイントを生成する場合は、独自のメソッドを定義して明示的にオブジェクトを複製する必要があります。こう

list.add(p); 
// modify p 
list.add(p); 

ちょうどあなたが探しているものではありませんこれは、二度同じ要素を挿入します。代わりに:

list.add(p); 
Waypoint p2 = p.duplicate(); 
list.add(p2); 

は、2つの異なるオブジェクトは、あなたが共有している情報から

+0

ありがとうございました!それが私を助けてくれました。 – Haris

0

duplicateが実際にnewで別のオブジェクトをインスタンス化すると仮定して)挿入する、答えはイエスです。同じインスタンスを配列に2回追加しています。

オブジェクトをコピーする最も簡単な方法は、オリジナルを引数として使用し、必要なメンバーをコピーするコンストラクタを定義することです。

0

Javaでは暗黙的なコピーはありません。すべてのオブジェクトは参照によって操作され、オブジェクトの変更は参照を保持するすべての人に影響します。

誰がどのような値を保持するのか混乱を避けるため、ほとんどのオブジェクトを作成することをお勧めします。immutable

ご質問のとおり、「コピー」は定義上新しいインスタンスになります。それ以外の場合は真のコピーではありません。

関連する問題