Работает ли мелкая копия как глубокая копия в случае неизменных объектов в java? - PullRequest
0 голосов
/ 29 марта 2020

Я читаю 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, и изменение должно быть видно во всех потоках.

1 Ответ

3 голосов
/ 29 марта 2020

Нет необходимости в глубоком копировании, потому что объекты Point неизменны и не могут изменяться. Это утверждается в:

Поскольку содержимое карты является неизменным

Если бы объекты Point были изменяемыми, на самом деле вам пришлось бы сделать глубокую копию.

Разница между двумя реализациями, если getLocations относится к видимости изменений в "структуре" карты. Первая реализация возвращает неизменяемое представление копии карты. Если местоположения добавляются или удаляются после возврата метода, он не будет виден на карте, возвращаемой этим методом. Вторая возвращает неизменяемый вид самой карты. Любые изменения, сделанные после возврата метода, будут видны вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...