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