Est-ce que le travail de copie peu profonde comme copie en profondeur dans le cas d'objets immuables en Java?

madcolonel10:

Je lis java dans concurrency pratique. Je suis tombé sur cet extrait qui me cause une certaine confusion. Si une vue immuable de la flotte est nécessaire, getLocations pourrait retourner à la place une copie peu profonde de la carte des emplacements. Étant donné que le contenu de la carte sont immuables, seule la structure de la carte, et non le contenu doit être copié.

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

Pour revenir une vue non modifiable , mais en direct des emplacements de véhicules .

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
}

Est -ce que cela implique que new HashMap<String,Point>(locations)est en train de faire une copie en profondeur des emplacements la carte et l' attribution d' une nouvelle référence en créant un nouvel objet pour le point lorsque la copie se passe. Ne doit pas copie superficielle new HashMap<String,Point>(locations)conserver la référence originale aux objets Point, et le changement est visible dans toutes les discussions.

Joni:

Il n'y a pas besoin d'une copie en profondeur parce que les objets Point sont immuables et ne peuvent pas changer. Ceci est affirmé dans:

Étant donné que le contenu de la carte sont immuables

Si les objets Point étaient mutable vous auriez en acte pour faire une copie en profondeur.

La différence entre les deux implémentations si getLocations fait référence à la visibilité des changements dans la « structure » de la carte. La première implémentation retourne une vue non modifiable d'une copie de la carte. Si les emplacements sont ajoutés ou supprimés après le retour de la méthode, il ne sera pas visible sur la carte retournée par cette méthode. Le second renvoie une vue non modifiable de la carte elle - même. Toute modification apportée après le retour de la méthode seront visibles à l'appelant.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=362686&siteId=1
conseillé
Classement