Bonjour,
En faite j'ai vu pas mal de fois
dans des programmes Eclipse, des méthodes get et set,
et je voulais vous demander c"était quoi leurs rôle et
comment on les utilises.
Merci pour vôtre aide.
Bonjour,
En faite j'ai vu pas mal de fois
dans des programmes Eclipse, des méthodes get et set,
et je voulais vous demander c"était quoi leurs rôle et
comment on les utilises.
Merci pour vôtre aide.
Si tu as dans une classe un champ "maVariable", pour donner accès à cette variable depuis l'extérieur de ta classe, tu peux grosso-modo :
- mettre le champ public => accès libre par n'importe qui, et donc possibilité pour les tierces parties de faire n'importe quoi (ex : mettre la variable dans un état "incohérent" par rapport au traitement que tu comptes en faire plus tard)
- conserver le champ privé, définir des méthodes publiques getMaVariable et setMaVariable => un peu plus lourd, mais possibilité de définir un get mais pas le set (-> lecture seule), contrôle total des actions effectuées sur la valeur de la variable (ex simple : contrôle valeur non nulle), possibilité de définir des actions supplémentaires par rapport à la "simple" lecture ou écriture (ex vraiment à la con : incrémentation d'un compteur)...
Bonjour,
J'ajoute ceci : Ces classes sert surtout pour les beans
Voici une classe qui donne à peu prêt, une classe chanson.
Dans notre cas pour récupérer le titre de la chanson, on fait appel à la méthode getTitre()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public class Chanson { private String Titre = " "; private String Artiste = " "; private String Duree = ""; public void setArtiste(String Artiste) { this.Artiste = Artiste; } public String getArtiste() { return Artiste; } public void setTitre(String Titre) { this.Titre = Titre; } public String getTitre() { return Titre; } public void setDuree(String Duree) { this.Duree = Duree; } public String getDuree() { return Duree; } }
Attention kmdkaci, ce que ta classe Chanson ne respecte pas les conventions : tes champs et méthodes doivent commencer par des minuscules.
ouuhhhh autant pour moi.... C'est pare ce que je viens de l'écrire sans le tester. Je vais le modifier.
Merci sewatech pour ta remarque
Les getters et les Setters sont respéctivement des accésseurs en lecture et en écriture.
get pour lire : accéder aux valeurs des variables d'instance
set pour alterer modifier les valeurs de variables d'instance
Je pense que principalement, le rôle de ces méthodes est de suivre une convention particulière liée aux JavaBeans ( "pojos" ) et ainsi de garder une cohérence dans les apis et les programmes.
De fait, certains framework se basent sur ces getters setters via l'introspection pour accéder aux champs d'un bean. ( notamment Spring )
Je te conseille de te renseigner sur le concept d'encapsulation, qui est un concept de base dans les languages objets.
Dernière chose : contrairement à ce qui a été dit plus haut, je ne conseille pas d'utiliser les getters/setters pour autre chose que ce que leur nom suggère. Il est dangereux de cacher des traitements dans ces méthodes, car ça peut vite devenir un enfer en maintenance.
A+
Oui, il est possible d'ajouter des traitements dans un getter ou un setter (comme dans n'importe quel autre méthode...) mais il faut faire très attention.
En effet quand on appelle un "getTruc" ou un "setTruc" on s'attend à ce que l'action réalisée derrière soit un simple accès en lecture ou en écriture à la variable truc, donc on ne s'attend pas à déclencher de grands traitements...
Pour donner des exemples :
- sur setTruc ou getTruc, logguer des messages de débug, y'a pas de problème
- sur getTruc, incrémenter un compteur interne qui compte le nombre d'accès à truc, ça va (bon c'est pas forcément super utile par contre)
- sur setTruc, commencer par vérifier que la valeur passée en paramètre vérifie certains critères, et éventuellement lever une exception, ça va
- sur setTruc, en profiter pour mettre à jour également une variable privée qui est censée rester cohérente avec truc, ça peut aller
- sur getTruc, modifier la valeur de truc ou modifier de manière intrinsèque l'état de ta classe, ça va pas ! parce qu'on s'attend à lire une valeur, pas à modifier quoique ce soit, et le fait que deux appels successifs à getTruc() renvoient des valeurs différentes n'est pas super intuitif...
- sur getTruc, se mettre à reconstruire une liste à partir d'une base de données, ça va pas ! parce qu'on s'attend à un accès simple et immédiat à une variable locale, donc l'utilisateur de ta classe va peut-être parsemer son code de getTruc sans se rendre compte de la lourdeur des traitements enclenchés... appeler la méthode en question extractTrucFromDatabase aura le mérite d'être beaucoup plus clair
- etc
Bref, ajouter des traitements supplémentaires, c'est théoriquement possible, mais il faut en user avec précaution...
Précision :
Tout ce que je dis concerne l'utilisation des getter/setter dans le seul but de renforcer le contrôle de l'accès aux champs d'une classe.
Il ne s'agit pas de leur utilisation dans le cadre des Beans.
Astartee : je suis d'accord avec la plupart des choses que tu dis, cependant, j'ai pour habitude de séparer les traitements dits de validation dans un endroit centralisé, plutôt que de devoir aller piocher à gauche ou à droite pour savoir ce qu'il se passe vraiment quand on fait un set ou un get.
A la rigueur, si le programme plante parce qu'on a fait un set d'une valeur primitive de type boolean avec un object Boolean NULL par exemple, ça me permet de relever un cas qui n'avait pas été prévu et de corriger ça dans les classes métier et/ou au moment de la validation.
Le principe du pojo est justement de rendre ces objets totalement vierges de traitement, afin qu'ils n'agissent que comme des conteneurs simple, dont le comportement est toujours défini pour tous les développeurs.
Je pense qu'au final ça doit être une question de goût
A+
Comme souvent dès qu'on demande "à quoi ça sert ?"
Par exemple, moi, écrire juste
je trouve que ça ne sert pas à grand chose... sinon peut-être à homogénéiser le code parce qu'à côté on aura d'autres variables sur lesquelles seul le getter aura été défini ?private int truc
public int getTruc() { return truc; }
public void setTruc(int t) {truc = t; }
bref, des goûts et des couleurs
EDIT
Ah tiens si, j'ai trouvé un autre avantage des getter et setter, et pas des moindres : on peut les définir dans une interface !
(ça doit être en C#, où l'utilisation de getter/setter est implicite, que je pouvais définir directement des "champs" dans les interfaces)
Juste pour information, les getter et les setters sous eclipse on peut les générer automatiquement il suffit de faire:
Dans le menu Source==> choisir l'option Generate Getters and Setters
c'est cool non?
Partager