12.6 Méthodes d'encapsulation et d'accès (getters et setters)
L'encapsulation est l'un des quatre piliers fondamentaux de la programmation orientée objet (POO), avec l'héritage, le polymorphisme et l'abstraction. L'encapsulation est la pratique consistant à garder les champs (variables d'instance) d'une classe privés et à y fournir un accès via des méthodes publiques. Ceci est fait pour garder le contrôle sur les valeurs définies et obtenues, et pour protéger l'intégrité des données détenues par la classe.
Les méthodes accesseurs, connues sous le nom de getters et setters, constituent le moyen standard d'implémentation de l'encapsulation en Java. Ce sont des méthodes publiques qui servent à obtenir (get) et à définir (définir) la valeur des champs privés d'une classe.
Conventions de dénomination pour les getters et les setters
En Java, il existe une convention de dénomination bien établie pour les getters et les setters qui permet de garder le code lisible, cohérent et accessible aux autres outils et frameworks qui s'appuient sur ces conventions.
Pour un champ appelé name
, par exemple, le getter serait nommé getName()
et le setter serait nommé setName()
. Cette convention s'applique à tous les champs, avec quelques règles spécifiques pour les champs booléens, où le getter commence souvent par is
au lieu de get
, comme isActive( ) dans un champ appelé
actif
.
Voici les règles générales pour nommer les getters et les setters :
- Getters : La méthode commence par le mot
get
suivi du nom du champ avec la première lettre en majuscule. Si le champ est de type booléen, vous pouvez également utiliser is
au lieu de get
.
- Setters : La méthode commence par le mot
set
suivi du nom du champ avec la première lettre en majuscule.
Ces méthodes doivent être marquées comme publiques afin qu'elles soient accessibles depuis l'extérieur de la classe. De plus, la méthode setter renvoie généralement void
et accepte un paramètre du même type que le champ qu'elle définit, tandis que le getter renvoie une valeur du même type que le champ.
Exemple d'implémentation des getters et setters
personne de classe publique {
nom de chaîne privé ;
âge int privé ;
actif booléen privé ;
// Getter pour le champ nom
chaîne publique getName() {
renvoyer le nom ;
}
// Setter pour le champ nom
public void setName (nom de la chaîne) {
this.name = nom ;
}
// Getter pour le champ âge
public int getAge() {
âge de retour;
}
// Setter pour le champ age
public void setAge(int âge) {
this.age = âge;
}
// Getter pour le champ actif (notez l'utilisation de 'is' au lieu de 'get')
public booléen isActive() {
retour actif ;
}
// Setter pour le champ actif
public void setActive (booléen actif) {
this.active = actif ;
}
}
Pourquoi utiliser des getters et des setters ?
Bien qu'il puisse sembler plus simple d'accéder directement aux champs, l'utilisation des getters et des setters présente plusieurs avantages :
- Contrôle d'accès : vous pouvez contrôler si un champ est en lecture seule ou en écriture seule, ou s'il doit suivre certaines règles de validation une fois défini.
- Masquage de l'implémentation : la classe peut modifier la façon dont les données sont stockées en interne sans affecter les classes qui les utilisent.
- Flexibilité : vous pouvez ajouter une logique supplémentaire aux méthodes d'accès, comme notifier d'autres objets des modifications apportées à la valeur, effectuer des validations ou même différer le calcul de la valeur jusqu'à ce qu'elle soit réellement nécessaire (paresse chargement ).
- Compatibilité des frameworks : de nombreux frameworks Java, tels que Spring et Hibernate, s'appuient sur des getters et des setters pour fonctionner correctement.
Il est important de noter que bien que les getters et les setters soient une pratique courante, ils ne sont pas obligatoires. Dans certains cas, où la classe est très simple et ne nécessite pas de contrôle supplémentaire sur ses champs, il peut être acceptable d'exposer les champs directement. Cependant, cela doit être fait avec prudence et en comprenant les conséquences sur la maintenabilité et la flexibilité du code.
En résumé, les getters et les setters constituent un élément crucial de l'encapsulation en Java. Ils fournissent une interface contrôlée pour accéder et modifier les champs d'une classe tout en conservant l'intégrité et la flexibilité du code. Suivre les conventions de dénomination de ces méthodes est essentiel pour maintenir la cohérence et garantir une interaction appropriée avec d'autres parties de l'écosystème Java.