Javaで不変オブジェクトの場合には、深いコピーと浅いコピーの仕事をしていますか?

madcolonel10:

私は実際にはJavaの並行処理を読んでいます。私は私にいくつかの混乱を引き起こしている。このスニペットに出くわしました。艦隊の不変のビューが必要な場合は、getLocationsではなく、場所のマップの浅いコピーを返すことができます。地図の内容は不変であるので、地図の唯一の構造は、その内容をコピーする必要がありません。

public Map<String,Point> getLocations(){
 return Collections.unmodifiableMap(new HashMap<String,Point>(locations));
}

車両位置の変更不可能なものの、ライブビューを返すには

public Map<String,Point> getLocations(){
return unmodifiableMap; //unmodifiableMap = Collections.unmodifiableMap(locations);
}
public class Point{
 public final int x,y;
 public Point(int x, int y){
  this.x = x;
  this.y=y;
 }
}
public void setLocation(String id,int x,int y){
 if(locations.replace(id,new Point(x,y==null)
   //throw exception for invalid vehicle
}

これは、それが意味するものではないnew HashMap<String,Point>(locations)場所の深いコピーをやってマップやコピーが起きているとき、ポイントのための新しいオブジェクトを作成することによって、新たな基準を割り当てています。シャローコピーはすべきではないnew HashMap<String,Point>(locations)Pointオブジェクトを元の参照を保持し、変更がすべてのスレッドで見ることができ。

ジョニ:

Pointオブジェクトは不変であり、変更することはできませんので、ディープコピーは必要ありません。これがアサートされます。

地図の内容は不変であるので、

Pointオブジェクトが可変した場合は、中の行為に深いコピーを作成する必要があります。

getLocationsもし2つの実装の間の差は、マップの「構造」の変化を視認性を指します。最初の実装は、変更不可能なビューを返しますコピーのマップのを。位置は、メソッドが戻った後に追加または削除される場合は、このメソッドによって返されたマップに表示されません。第二は、地図自体の変更不可能なビューを返します。方法復帰後に行われた変更は、呼び出し元に表示されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=362667&siteId=1