Imaginez que j'ai cette classe :
public class Test
{
private String[] arr = new String[]{"1","2"};
public String[] getArr()
{
return arr;
}
}
Maintenant, j'ai une autre classe qui utilise la classe ci-dessus :
Test test = new Test();
test.getArr()[0] ="some value!"; //!!!
Voici donc le problème : j'ai accédé à un champ privé d'une classe depuis l'extérieur ! Comment puis-je empêcher cela ? Je veux dire comment puis-je rendre ce tableau immuable ? Cela signifie-t-il qu'avec chaque méthode getter, vous pouvez vous frayer un chemin jusqu'à l'accès au champ privé ? (Je ne veux pas de bibliothèques telles que Guava. J'ai juste besoin de connaître la bonne façon de faire).
10 votes
En fait, le faire
final
fait empêcher la modification du champ . Cependant, empêcher la modification de laObject
référencée par un champ est plus compliquée.22 votes
Il y a un problème avec votre modèle mental si vous pensez qu'être capable de modifier un tableau auquel vous avez une référence stockée dans un champ privé est la même chose que d'être capable de modifier un champ privé.
46 votes
Si c'est privé, pourquoi l'exposer en premier lieu ?
1 votes
OldCurmudgeon et sp00m anwsers ont tous deux raison. Lequel utiliser dépend de la situation. Je vous recommande de lire Effective Java - Point 13 : Minimiser l'accessibilité des classes et des membres.
7 votes
Cela m'a pris un certain temps pour comprendre cela, mais cela améliore toujours mon code lorsque je m'assure que toutes les structures de données sont complètement encapsulées dans leur objet - ce qui signifie qu'il n'y a aucun moyen de "récupérer" votre "arr", mais plutôt de faire ce que vous devez faire à l'intérieur de la classe ou de fournir un itérateur.
0 votes
Je propose de modifier le titre en
Prevent modification to a private array field?
.2 votes
Je vois que personne n'a mentionné Effective Java de Josh Bloch -
Item 39: Make defensive copies when needed
9 votes
Quelqu'un d'autre est-il également surpris que cette question ait suscité autant d'attention ?
0 votes
Je ne comprends pas les votes positifs pour le commentaire d'Erik Reppen. L'encapsulation des données ne signifie pas que vous ne pouvez pas exposer l'état interne, mais il faut s'assurer que l'instance contrôle l'état interne (par exemple en ne renvoyant que des valeurs en lecture seule ou des copies des valeurs stockées).