J'essaie de rendre ma classe de visage immuable de sorte que mon objet de visage ne change pas une fois que cela a été initialisé. C'est ce que j'ai jusqu'à présent: Cependant, lorsque j'essaie d'exécuter ce qui suit: p> Je pense que f de rester comme p> mais je finis à obtenir p> à la place. Est-ce que mon objet de visage n'est pas rendu immuable même si j'ai déjà déclaré la classe comme finale? P> P>
3 Réponses :
Vous devez faire une copie défensive de l'entrée En outre, les champs doivent être non testé: p> grille code> dans le constructeur.
privé code> aussi, et la classe devrait être
final code> aussi, bien que je soupçonne que ces deux derniers points ne sont pas la cause de votre problème. p>
public Face(int[][] grid){
int temp[][] = new int[ grid.length ][];
for( int i = 0; i < temp.length; i++ )
temp[i] = Arrays.copyOf( grid[i], grid[i].length );
this.grid = temp;
}
Votre problème pourrait être que votre constructeur ne clonant pas la matrice entrante. Donc, peut-être que le code qui crée l'instance de classe de visage puis manipule la matrice qu'il a transmis au nouvel objet facial! p>
Malheureusement, il n'y a aucun moyen de créer des tableaux vraiment immuables dans le Java. Déclarant un tableau en tant que finale ne vous empêche que de changer le tableau dans son ensemble, il est toujours possible de modifier des lignes individuelles, des colonnes, des emplacements dans ce tableau. P>
Si vous voulez des collections immuables, vous devez transformer les classes de collecte réelles, puis utiliser les méthodes dans la classe de collections pour créer des vues non modifiables sur eux. P>
Soyez prudent lorsque vous utilisez sur les tableaux, il fait une copie peu profonde. Le snippet suivant l'explique mieux: P> clone code>.
int[] c0 = new int[]{1, 2, 3};
int[] c1 = new int[]{4, 5, 6};
int[] c2 = new int[]{7, 8, 9};
int[][] grid = new int[][]{c0, c1, c2};
int[][] cloned = grid.clone();
assert cloned[0] == c0;
assert cloned[1] == c1;
assert cloned[2] == c2;
final code> fait la variable, dans ce cas, une référence, immuable. Vous ne pouvez pas modifier la référence mais vous pouvez changer la chose que la référence se réfère.
Élaborer sur ce que PVG a déclaré: le point important sur
final code> est que vous MUS PAS B> Changer la chose des points de référence, non pas que vous ne pouvez pas, ou votre objet n'est pas 't immuable plus.
final code> n'empêche pas cela, donc vous devez donc vous copier de l'objet.