Pourquoi utiliser des getters et setters/accesseurs?

Quel est l'avantage d'utiliser les accesseurs et mutateurs - que seuls les get et set - au lieu de simplement en utilisant les champs de ces variables?

Si les getters et les setters sont de plus en plus que la simple get/set, je peux comprendre ça très vite, mais je ne suis pas 100% clair sur la façon dont:

public String foo;

est pire que:

private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

Alors que le premier prend beaucoup moins de code réutilisable.

  • J: Doublon avec beaucoup d'autres questions: stackoverflow.com/search?q=getters+setters
  • Bien sûr, les deux sont aussi mauvais l'un que lorsque l'objet n'a pas besoin d'une propriété afin d'être changé. Je préfère tout faire en privé, et ensuite ajouter des accesseurs si utile, et en établissant, si nécessaire.
  • Google "accesseurs sont mal"
  • "Accesseurs sont mal" si vous arrive d'être de l'écriture de code fonctionnel ou des objets immuables. Si vous arrive d'être écrit stateful mutable objets, puis ils sont assez à l'essentiel.
  • Dire, ne demandez pas. pragprog.com/articles/tell-dont-ask
  • À l'exception de 6 et 8, oserais-je dire qu'aucun de ces points sont appliquées dans 99% des cas. Encore, je voudrais java utiliser String s = employee.name() et employee.name("oscar") au lieu de getName() setName()
  • Reyes, oui, je serais d'accord que 6 & 8 sont les deux plus courants à partir de mon expérience. Cela dit, je préfère encore ne pas utiliser le C#ish syntaxe; mon vieux cerveau est confus.
  • Eh bien, je suis étonné que personne ne parle de la synchronisation des données. Supposons que vous utilisez public String foo; ses pas thread-safe! Au lieu de cela, vous pouvez définir getter setters avec des techniques de synchronisation pour éviter l'infidélité[je veux dire un autre thread gâcher la foo]. J'ai senti qu'il vaut la peine de mentionner.
  • Plus souvent que jamais, la synchronisation de l'unique accès à un objet est inefficace, ou même sujette à des problèmes de synchronisation (quand vous avez besoin de modifier plusieurs propriétés d'un objet à la fois). IME, vous avez souvent besoin d'envelopper l'ensemble des opérations qui n'plusieurs accès à un objet. Qui ne peut être accompli que par la synchronisation sur le côté des utilisateurs d'un type.
  • Ne pas compiler vos parties préférées de toutes les réponses dans la question elle-même. C'est un Q&Un site, pas un forum.
  • que devrais-je lire pour comprendre la programmation orientée objet en premier lieu?
  • Il y a aussi la très importante question de partage de code avec d'autres, si vous traitez les champs d'objet comme des parties de l'extérieur de l'interface pour d'autres personnes à utiliser ensuite de changer le domaine d'une fonction peut être impossible sans casser des changements dans d'autres peuples code.
  • Merci pour le lien, je suis en train de travailler sur la compréhension de la programmation orientée objet est censé être, mais il s'avère difficile avec la quantité de désinformation qui circulent. P. S. j'ai aussi trouver wikipédia pour être l'une des meilleures sources dans de nombreux domaines scientifiques.
  • il est tout au sujet de ne pas avoir à savoir qui de 500 fonctions est en fait de modifier une valeur. Vous apportez une valeur ou un ensemble de valeurs de quelque chose de la responsabilité, plutôt que quelque chose qui doit être placé sur un param/retour en dents de scie. Éviter de vanille getters/setters et les propriétés publiques et vous aurez souvent trouver vous-même avoir à vous arrêter et de réfléchir à comment le modèle de votre application dans une manière qui est généralement plus facile à lire, modifier, réutiliser, grandes pièces de, de débogage, et de leur faire confiance sans tester la bejeezus hors de lui. Java et C# overfeatured de la programmation orientée objet, puis l'a abandonné, de l'OMI.
  • Un autre article tente de lignes directrices sur où et quand utiliser les accesseurs et mutateurs: Public ou Privé, Membre des Variables? Le principe de YAGNI nous guide à ne pas ajouter des constructions jusqu'à ce que nous savons vraiment, nous allons avoir besoin d'eux.
  • Points 2, 3 (?), 4, 5 et 8: provisoire oui. Les autres, clairement non. Pourquoi importe-t-il si vous avez utilisé Python, C#, Ruby, Objective-C ou un esolang si votre code est simple, élégant et facilement maintenable/extensible?
  • 666 upvotes ne semble pas être une coïncidence
  • "Les gens peuvent facilement vous dire de ne pas utiliser Python." devrait en fait être N ° 1!
  • Pourriez-vous illustrer comment c'est une bonne chose?
  • Avez-vous l'esprit en expliquant le numéro 10?
  • J'étais juste une blague, parce que l'auteur a clairement n'était pas grave lors de l'ajout à la liste.
  • 11. Ce sont des endroits utiles pour définir des points d'arrêt lors du débogage d'état (extrait/modifié à partir de divers endroits.
  • Une récente question m'a rappelé une autre raison pour les méthodes: la capacité de déclencher une changement de propriété d'.

InformationsquelleAutor Dean J | 2009-10-14