ConstructiCat Logo
CodeBust.
Browse section ▾

Auto-encapsuler un champ.

Problem

Vous accédez directement aux champs privés à l'intérieur d'une classe.

Solution

Créez un getter et un setter pour le champ, et utilisez-les exclusivement pour accéder au champ.

##Example

Before
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= low && arg <= high;
  }
}
After
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

  1. Créez un getter (et éventuellement un setter) pour le champ. Ils doivent être soit protected, soit public.

  2. Trouvez tous les accès directs au champ et remplacez-les par des appels au getter et au setter.