O trabalho de cópia superficial como cópia profunda em caso de objetos imutáveis em Java?

madcolonel10:

Estou lendo java simultaneidade na prática. Me deparei com este trecho que está me causando alguma confusão. Se for necessária uma visão imutável da frota, getLocations poderia, em vez retornar uma cópia superficial do mapa locais. Desde o conteúdo do Mapa são imutáveis, apenas a estrutura do mapa, e não o conteúdo deve ser copiado.

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

Para retornar uma visão não modificável, mas ao vivo dos locais de veículos .

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
}

Será que isso significa que new HashMap<String,Point>(locations)está a fazer uma cópia profunda dos locais mapa e atribuir uma nova referência através da criação de um novo objeto para o ponto quando a cópia está acontecendo. Cópia superficial não deve new HashMap<String,Point>(locations)manter a referência original para objetos Point, e a mudança ser visível em todas as threads.

Joni:

Não há necessidade de uma cópia profunda porque os objetos Point são imutáveis ​​e não pode mudar. Isto é afirmado em:

Desde o conteúdo do Mapa são imutáveis

Se os objetos Point foram mutável você de fato tem que fazer uma cópia profunda.

A diferença entre as duas implementações se getLocations refere-se a visibilidade para mudanças na "estrutura" do mapa. A primeira implementação retorna uma visão não modificável de uma cópia do mapa. Se locais são adicionados ou removidos após o método retorna, ele não será visível no mapa retornado por esse método. O segundo retorna uma visão não modificável do próprio mapa. Quaisquer alterações feitas após o método retorna será visível para o chamador.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=357287&siteId=1
Recomendado
Clasificación