Les Getters et les Setters mettent en œuvre le concept de encapsulation dans la programmation orientée objet.
En cachant les états de l'objet au monde extérieur, l'objet est véritablement responsable de lui-même et ne peut être modifié de manière non intentionnelle. Les seules façons de manipuler l'objet sont les méthodes publiques exposées, telles que les getters et setters.
Il y a quelques avantages à avoir des getters et des setters :
1. Permettre des changements futurs sans modifier le code qui utilise la classe modifiée.
L'un des grands avantages de l'utilisation d'un getter et d'un setter est qu'une fois que les méthodes publiques sont définies et qu'il arrive un moment où l'implémentation sous-jacente doit être modifiée (par exemple, découverte d'un bogue qui doit être corrigé, utilisation d'un algorithme différent pour améliorer les performances, etc.), le fait que les getters et setters soient le seul moyen de manipuler l'objet permet au code existant de ne pas être cassé et de fonctionner comme prévu même après le changement.
Par exemple, disons qu'il y a un setValue
qui définit la méthode value
variable privée dans un objet :
public void setValue(int value)
{
this.value = value;
}
Mais une nouvelle exigence est apparue, qui nécessitait d'enregistrer le nombre de fois où l'on avait besoin d'une assistance technique. value
a été modifié. Avec l'outil de définition en place, le changement est assez trivial :
public void setValue(int value)
{
this.value = value;
count++;
}
Si el value
sont publics, il n'y a pas de moyen facile de revenir plus tard et d'ajouter un compteur qui garde la trace du nombre de fois où la valeur a été modifiée. Par conséquent, l'existence de getters et de setters est un moyen de "protéger" la classe contre les changements qui pourraient survenir ultérieurement.
2. Renforcer les moyens par lesquels l'objet peut être manipulé.
Les getters et setters sont également utiles pour imposer les manières dont l'objet peut être manipulé, ce qui permet à l'objet de contrôler son propre état. Si les variables publiques d'un objet sont exposées, elles peuvent facilement être corrompues.
Par exemple, un ImmutableArray
contient un int
tableau appelé myArray
. Si le tableau était un champ public, il ne serait pas immuable :
ImmutableArray a = new ImmutableArray();
int[] b = a.myArray;
b[0] = 10; // Oops, the ImmutableArray a's contents have been changed.
Pour mettre en œuvre un tableau réellement immuable, il est nécessaire d'ajouter un getter pour le tableau ( getArray
) doit être écrite de manière à ce qu'elle renvoie une copie de son tableau :
public int[] getArray()
{
return myArray.clone();
}
Et même si le cas suivant se produit :
ImmutableArray a = new ImmutableArray();
int[] b = a.getArray();
b[0] = 10; // No problem, only the copy of the array is affected.
Le ImmutableArray
est en effet immuable. Exposer les variables d'un objet permettra de le manipuler d'une manière qui n'est pas prévue, mais ce n'est qu'en exposant certaines manières (getters et setters) que l'objet peut être manipulé d'une manière prévue.
Je suppose que le fait d'avoir des getters et des setters serait plus important pour les classes qui font partie d'une API qui va être utilisée par d'autres, car cela permet de garder l'API intacte et inchangée tout en autorisant des changements dans l'implémentation sous-jacente.
Compte tenu de tous les avantages des getters et setters, si le getter ne fait que renvoyer la valeur de la variable privée et que le setter ne fait qu'accepter une valeur et l'assigner à une variable privée, il semble que les getters et setter soient tout simplement superflus et constituent un véritable gaspillage. Si la classe est destinée à un usage interne par une application qui ne sera pas utilisée par d'autres, l'utilisation extensive des getters et des setters n'est peut-être pas aussi importante que lors de l'écriture d'une API publique.
0 votes
Voir aussi stackoverflow.com/questions/996179