Comment puis-je empêcher la modification d'un champ privé dans une classe?

Imaginer que j'ai de 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!"; //!!!

Donc, c'est le problème: j'ai consulté un domaine privé d'une classe à partir de l'extérieur!
Comment puis-je éviter cela? Je veux dire, comment puis-je faire de ce tableau immuable? Est-ce à dire que chaque méthode de lecture vous pouvez travailler votre chemin jusqu'à accéder à la zone privée? (Je ne veux pas de bibliothèques comme la Goyave. J'ai juste besoin de connaître la bonne façon de le faire).

  • faire final
  • En fait, le rendant final empêche la modification du champ. Toutefois, la prévention de la modification de la Object visé par un champ est plus compliqué.
  • Il y a un problème avec votre modèle mental si vous pensez être en mesure de modifier un tableau pour lequel vous avez une référence stockée dans un champ privé est la même chose que d'être en mesure de modifier un champ privé.
  • Si c'est le privé, pourquoi l'exposer en premier lieu?
  • Les deux OldCurmudgeon et sp00m anwsers sont à droite. À utiliser dépend de la situation. Je vous recommande de lire Efficace Java - Item 13: Minimiser l'accessibilité des classes et des membres.
  • Il m'a fallu un certain temps pour comprendre cela, mais il améliore toujours mon code quand j's'assurer que toutes les structures de données sont entièrement encapsulés à l'intérieur de leur objet-à-dire il n'existe aucun moyen pour "Obtenir" votre "arr", au lieu de faire qu', vous devez à l'intérieur de la classe ou de fournir un itérateur.
  • Je propose l'édition du titre de Prevent modification to a private array field?.
  • Je vois que personne n'a mentionné Josh Bloch Effectif de Java - Item 39: Make defensive copies when needed
  • Est ce que quelqu'un d'autre aussi surpris de voir pourquoi cette question a eu tellement d'attention?
  • Je n'ai pas l'upvotes pour Erik Reppen commentaire. L'encapsulation de données ne signifie pas que vous ne pouvez pas exposer l'état interne, mais il doit s'assurer que l'instance de contrôle de l'état interne (par exemple en renvoyant uniquement en lecture seule des valeurs ou des copies des valeurs stockées).

InformationsquelleAutor Hossein | 2013-02-11