L'un des moyens que nous pouvons appliquer encapsulation de données est à travers l'utilisation d'accesseurs et de 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 les accesseurs et les mutateurs dans Java. Par exemple, nous utiliserons un Classe de personne avec l'état et le constructeur déjà définis:
Méthodes d'accesseur
Un 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:
Méthodes de mutation
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:
Pourquoi utiliser des accesseurs et des mutateurs?
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. L'extra tampon fourni par ces méthodes nous permet de:
- Modifiez la façon dont les données sont traitées en arrière-plan.
- Imposer une validation sur les valeurs auxquelles les champs sont définis.
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é.