bonjour,
J ai une ambiguïté concernant les accesseurs ,en fait je ne vois pas la différence entre déclarer une variable private et creer un accesseur vers celle-ci et entre la déclarer public, je ne vois pas donc l intéret des accessures.
bonjour,
J ai une ambiguïté concernant les accesseurs ,en fait je ne vois pas la différence entre déclarer une variable private et creer un accesseur vers celle-ci et entre la déclarer public, je ne vois pas donc l intéret des accessures.
La différence est que le fait d'utiliser des accesseurs permet de cacher l'implémentation interne. En plus de cela, cela améliore l'extensibilité de ta classe, car tu peux rajouter du code dans les méthodes ou alors retourner une autre variable ou une constante. Ce que tu ne peux pas faire avec l'accès à une variable interne.
Merci pour la réponse, mais, en fait, je n ai pas bien compris .
D aprés mes connaissances (assez modestes) cacher l implémentation revient a ne pas voir le code, mais si une variable est public on ne peut pas forcement voir le code d une methode de la classe (si la methode est private) .
Pour l extensibilité , je pense que meme si une variable est public on peut toujours rajouter du code dans n importe quelle methode .
Je pense que ,si c est possible, un exemple avec et sans les accessurs me servira plus pour voir la différence.
Et merci encore.
Bien sûr que même avec une variable publique tu peux modifier du code, mais tu ne peux pas modifier le code d'accès à la variable.
par exemple tu as :
Dans une classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public int v1 = 12; private int v2 = 10; public int getV2(){ return v2; } public void setV2(int v2){ this.v2 = v2; }
Si tu veux avertir une autre classe chaque fois que v2 change, c'est très simple :
Mais si tu veux avertir les autres classes chaque fois que v1 change, ce n'est pas possible. Tu serais obligé de rajouter des accesseurs, de passer ta variable private et de modifier tout le code utilisant cette variable. C'est ça l'extensibilité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public void setV2(int v2){ int oldValue = this.v2; avertOtherClass(v2, oldValue); this.v2 = v2; }
Merci d abord,
Maintenant je vois une différence , avec une variable publique on peut modifier la variable ,mais on ne peut pas avertir les autres classes ,chose qu on peut faire a l aide des accesseurs (et faire beaucoup de choses relatives a la modification de la variable) ce qui rend le programme plus extensible, mais je me demande si c est la différence principale![]()
Bonjour,
D'autres exemples d'intérêts en vrac:
- dans tes setBidule, tu peux rajouter des vérifications fonctionelles (si tu veux par exemple interdire de mettre un âge inférieur à 0...)
- dans les getBidule, ce qui m'a sauvé la vie une fois: j'avais une variable X dans une classe, précisée par l'utilisateur. Un jour on m'a dit: cette variable n'a plus de raison d'être, elle doit être déduite de deux autres variables Y et Z. De plus, on veut garder un historique des changements.
Si j'étais passé par un attribut "public", j'aurai du repasser sur tout le code de mon application.
Grâce aux getters/setters, je me suis contenté de rendre inopérant le setter, et de faire l'évaluation de ma variable X dans le getter, en fonction de Y et Z.
Tout est question de contrôle: tu n'as aucun pouvoir sur l'accès à une variable publique. En revanche tu contrôle ce que tu fais dans une méthode.
Dans de nombreux développements Java, on utilise les JavaBeans.
Il existe des conventions SUN pour les utiliser. Une de celles-ci est de mettre les propriétés en private et d'avoir des getters et setters associés en public.
Les propriétés (dans la majorité des cas) doivent être en minuscule, les getters et setters doivent avoir la première lettre de la propriété en majuscule et le reste en minuscule.
En respectant ces conventions, de nombreux "applicatifs" (struts par exemple) arrive à lire et à écrire dans nos beans de façon générique en utilisant l'introspection.
Arnaud
Merci d'abord,
Pour Jidefix, tes exemples m'ont servi beaucoup pour mieux comprendre la différence.
Pour Coulon Arnaud: Etant débutant en java je n'ai pas compris ton intervention, mais merci quand meme.
Partager