Una de las formas en que podemos imponer la encapsulación de datos es mediante el uso de accesores y mutadores. El papel de los accesores y mutadores es devolver y establecer los valores del estado de un objeto. Aprendamos a programar accesores y mutadores en Java. Como ejemplo, usaremos una clase Person con el estado y el constructor ya definidos:
Se utiliza un método de acceso para devolver el valor de un campo privado. Sigue un esquema de nomenclatura que antepone la palabra "get" al comienzo del nombre del método. Por ejemplo, agreguemos métodos de acceso para nombre, segundo nombre y apellido:
Estos métodos siempre devuelven el mismo tipo de datos que su campo privado correspondiente (por ejemplo, Cadena) y luego simplemente devuelven el valor de ese campo privado.
Ahora podemos acceder a sus valores a través de los métodos de un objeto Person:
Se utiliza un método mutador para establecer un valor de un campo privado. Sigue un esquema de nomenclatura que antepone la palabra "set" al comienzo del nombre del método. Por ejemplo, agreguemos campos mutantes para dirección y nombre de usuario:
Estos métodos no tienen un tipo de retorno y aceptan un parámetro que es el mismo tipo de datos que su campo privado correspondiente. El parámetro se usa para establecer el valor de ese campo privado.
Ahora es posible modificar los valores para la dirección y el nombre de usuario dentro del objeto Persona:
Es fácil llegar a la conclusión de que podríamos cambiar los campos privados de la definición de clase para que sean públicos y lograr los mismos resultados. Es importante recordar que queremos ocultar los datos del objeto tanto como sea posible. El búfer adicional proporcionado por estos métodos nos permite:
Digamos que decidimos modificar la forma en que almacenamos los segundos nombres. En lugar de solo una cadena, ahora podemos usar una matriz de cadenas:
La implementación dentro del objeto ha cambiado pero el mundo exterior no se ve afectado. La forma en que se llaman los métodos sigue siendo exactamente la misma:
O, supongamos que la aplicación que utiliza el objeto Persona solo puede aceptar nombres de usuario que tengan un máximo de diez caracteres. Podemos agregar validación en el mutador setUsername para asegurarnos de que el nombre de usuario cumple con este requisito:
Ahora, si el nombre de usuario pasado al setUsername mutator tiene más de diez caracteres, se trunca automáticamente.