0
votes

Ma classe de visage ne semble pas être immuable, même si je l'ai déjà déclarée en finale, comment puis-je le corriger?

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: xxx

Cependant, lorsque j'essaie d'exécuter ce qui suit: xxx

Je pense que f de rester comme xxx

mais je finis à obtenir xxx

à 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?


2 commentaires

final 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 est que vous MUS PAS 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 n'empêche pas cela, donc vous devez donc vous copier de l'objet.


3 Réponses :


1
votes

Vous devez faire une copie défensive de l'entrée grille code> dans le constructeur.

En outre, les champs doivent être 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>

non testé: 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;
  }


0 commentaires

0
votes

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!

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.

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.


0 commentaires

0
votes

Soyez prudent lorsque vous utilisez clone code>.

sur les tableaux, il fait une copie peu profonde. Le snippet suivant l'explique mieux: P>

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;


0 commentaires