L'un des moyens par lesquels nous pouvons imposer l'encapsulation des données consiste à utiliser des accesseurs et des mutateurs. Le rôle des accesseurs et des mutateurs est de renvoyer et de définir les valeurs de l'état d'un objet. Apprenons à programmer des accesseurs et des mutateurs en Java. À titre d'exemple, nous utiliserons une classe Person avec l'état et le constructeur déjà définis:
Une méthode d'accesseur est utilisée pour renvoyer la valeur d'un champ privé. Il suit un schéma de nommage préfixant le mot "get" au début du nom de la méthode. Par exemple, ajoutons des méthodes d'accesseur pour firstname, middleNames et lastname:
Ces méthodes renvoient toujours le même type de données que leur champ privé correspondant (par exemple, String), puis renvoient simplement la valeur de ce champ privé.
Nous pouvons désormais accéder à leurs valeurs via les méthodes d'un objet Person:
Une méthode de mutation est utilisée pour définir une valeur d'un champ privé. Il suit un schéma de nommage préfixant le mot "set" au début du nom de la méthode. Par exemple, ajoutons des champs de mutation pour l'adresse et le nom d'utilisateur:
Ces méthodes n'ont pas de type de retour et acceptent un paramètre qui est le même type de données que leur champ privé correspondant. Le paramètre est ensuite utilisé pour définir la valeur de ce champ privé.
Il est désormais possible de modifier les valeurs de l'adresse et du nom d'utilisateur dans l'objet Person:
Il est facile de conclure que nous pourrions simplement changer les champs privés de la définition de classe pour qu'ils soient publics et obtenir les mêmes résultats. Il est important de se rappeler que nous voulons masquer autant que possible les données de l'objet. Le tampon supplémentaire fourni par ces méthodes nous permet de:
Disons que nous décidons de modifier la façon dont nous stockons les noms intermédiaires. Au lieu d'une seule chaîne, nous pouvons maintenant utiliser un tableau de chaînes:
L'implémentation à l'intérieur de l'objet a changé mais le monde extérieur n'est pas affecté. La façon dont les méthodes sont appelées reste exactement la même:
Ou, disons que l'application qui utilise l'objet Person ne peut accepter que des noms d'utilisateur comportant au maximum dix caractères. Nous pouvons ajouter une validation dans le mutateur setUsername pour nous assurer que le nom d'utilisateur est conforme à cette exigence:
Maintenant, si le nom d'utilisateur transmis au mutateur setUsername dépasse dix caractères, il est automatiquement tronqué.