L’encapsulation

images/whitebelt.png

Les types gérant correctement les dates et l’heure existent en Java (dans le package java.time) il est donc inutile (et dangereux) de tenter de définir soi-même un type Date! Mais pour les besoins de la démonstration imaginons que nous fassions précisément une définition de ce genre !

public class MaDate {
   // juste pour les besoins de l'exposé
   // il existe déjà une classe Date (à ne pas utiliser)

   public int jour ;
   public int mois ;
   public int année ;
}

Ce code peut être utilisé à mauvais escient (par exemple en utilisant des valeurs illégales pour les champs) donc le concepteur de la classe peut vouloir contrôler la création des objets correspondants.

public class MaDate {
   public final int jour ;
   public final int mois ;
   public final int année ;

   public  MaDate(int jour, int mois, int année) {
      // ici contrôles sur les valeurs
      this.jour = jour ;
      this.mois = mois ;
      this.année = année ;
   }
}

Ceci dit cette réalisation expose au code client plus de détails qu’il n’est nécessaire: si le développeur responsable du code de la classe veut faire évoluer son code il est limité par les utilisations qu’en font le code client. Si, par exemple, le responsable du code veut remplacer les trois champs par une seule valeur de type long (ce qui est classique quand on manipule à un très bas niveau des données de date) il ne peut faire cette modification sans entrainer des modifications du code client!

Dans une architecture basée sur des composants logiciels le "producteur" d’un code ne connait pas forcément les "consommateurs" et il serait malvenu de forcer ces derniers à réécrire du code à chaque nouvelle version d’une classe!

Une classe utilisant l’encapsulation. 

public class MaDate {
   private int jour ;
   private int mois ;
   private int année ;

   public  MaDate(int jour, int mois, int année) {
      // ici contrôles sur les valeurs
      this.jour = jour ;
      this.mois = mois ;
      this.année = année ;
   }

   public int getJour() { return this.jour ; }
   public int getMois() { return this.mois ; }
   public int getAnnée() { return this.année ;}
}

Ici la personne responsable du code fournit aux codes appelants une A.P.I marquée public. Tout ce qui concerne la réalisation concrète reste réservé au responsable du code et peut être changé sans modifications des codes appelants: ces éléments sont marqués private et sont inaccessibles aux codes appelants!