Я читаю 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)
делает глубокую копию карты местоположений и назначает новую ссылку, создавая новый объект для Point при копировании это происходит. Не должно быть мелкой копии new HashMap<String,Point>(locations)
, сохраняющей исходную ссылку на объекты Point, и изменение должно быть видно во всех потоках.