Auto-encapsuler un champ.
Vous accédez directement aux champs privés à l'intérieur d'une classe.
Créez un getter et un setter pour le champ, et utilisez-les exclusivement pour accéder au champ.
##Example
class Range {
private int low, high;
boolean includes(int arg) {
return arg >= low && arg <= high;
}
}class Range {
private int low, high;
boolean includes(int arg) {
return arg >= getLow() && arg <= getHigh();
}
int getLow() {
return low;
}
int getHigh() {
return high;
}
}##Why Refactor
Parfois, accéder directement à un champ privé à l'intérieur d'une classe n'est tout simplement pas assez flexible. Vous voulez pouvoir initialiser la valeur d'un champ lors de la première requête, ou effectuer certaines opérations sur les nouvelles valeurs du champ au moment de leur affectation, voire faire tout cela de différentes manières dans les sous-classes.
##Benefits
-
L'accès indirect aux champs consiste à agir sur un champ via des méthodes d'accès (getters et setters). Cette approche est bien plus flexible que l'accès direct aux champs.
-
Premièrement, vous pouvez effectuer des opérations complexes lorsque les données du champ sont définies ou récupérées. L'initialisation paresseuse et la validation des valeurs du champ s'implémentent facilement à l'intérieur des getters et setters du champ.
-
Deuxièmement, et c'est plus crucial, vous pouvez redéfinir les getters et setters dans les sous-classes.
-
-
Vous avez la possibilité de ne pas implémenter de setter du tout pour un champ. La valeur du champ ne sera alors spécifiée que dans le constructeur, rendant ainsi le champ immuable pendant toute la durée de vie de l'objet.
##How to Refactor
-
Créez un getter (et éventuellement un setter) pour le champ. Ils doivent être soit
protected, soitpublic. -
Trouvez tous les accès directs au champ et remplacez-les par des appels au getter et au setter.