12.6 Métodos de encapsulación y acceso (Getters y Setters)
La encapsulación es uno de los cuatro pilares fundamentales de la programación orientada a objetos (POO), junto con la herencia, el polimorfismo y la abstracción. La encapsulación es la práctica de mantener privados los campos (variables de instancia) de una clase y proporcionar acceso a ellos a través de métodos públicos. Esto se hace para mantener el control sobre los valores que se establecen y obtienen, y para proteger la integridad de los datos que posee la clase.
Los métodos de acceso, conocidos como captadores y definidores, son la forma estándar de implementar la encapsulación en Java. Son métodos públicos que sirven para obtener (get) y fijar (set) el valor de campos privados de una clase.
Convenciones de nomenclatura para captadores y definidores
En Java, existe una convención de nomenclatura bien establecida para captadores y definidores que ayuda a mantener el código legible, coherente y accesible para otras herramientas y marcos que dependen de estas convenciones.
Para un campo llamado name
, por ejemplo, el captador se llamaría getName()
y el definidor se llamaría setName()
. . Esta convención se aplica a todos los campos, con algunas reglas específicas para los campos booleanos, donde el captador a menudo comienza con is
en lugar de get
, como isActive() code> a un campo llamado
active
.
Estas son las reglas generales para nombrar captadores y definidores:
- Getters: El método comienza con la palabra
get
seguida del nombre del campo con la primera letra en mayúscula. Si el campo es de tipo booleano, también puedes usaris
en lugar deget
. - Establecedores: El método comienza con la palabra
set
seguida del nombre del campo con la primera letra en mayúscula.
Estos métodos deben marcarse como públicos para que se pueda acceder a ellos desde fuera de la clase. Además, el método de establecimiento generalmente devuelve void
y acepta un parámetro del mismo tipo que el campo que está definiendo, mientras que el método de obtención devuelve un valor del mismo tipo que el campo.
Ejemplo de implementación de Getters y Setters
Persona de clase pública { nombre de cadena privada; edad privada; booleano privado activo; // Captador para el campo de nombre cadena pública getName() { nombre de retorno; } // Establecedor del campo de nombre setName público vacío (nombre de cadena) { this.nombre = nombre; } // Getter para el campo de edad público int getAge() { edad de retorno; } // Establecedor del campo de edad setAge público vacío (int edad) { this.age = edad; } // Captador para el campo activo (tenga en cuenta el uso de 'is' en lugar de 'get') público booleano isActive() { volver activo; } // Establecedor del campo activo public void setActive (booleano activo) { this.active = activo; } }
¿Por qué utilizar captadores y definidores?
Aunque puede parecer más sencillo acceder a los campos directamente, existen varias ventajas al utilizar captadores y definidores:
- Control de acceso: puede controlar si un campo es de solo lectura o de solo escritura, o si debe seguir ciertas reglas de validación cuando se define.
- Ocultación de implementación: la clase puede cambiar la forma en que se almacenan los datos internamente sin afectar las clases que los usan.
- Flexibilidad: puede agregar lógica adicional a los métodos de acceso, como notificar a otros objetos sobre cambios en el valor, realizar validaciones o incluso posponer el cálculo del valor hasta que realmente sea necesario (lazy cargando).
- Compatibilidad de marcos: muchos marcos de Java, como Spring e Hibernate, dependen de captadores y definidores para funcionar correctamente.
Es importante tener en cuenta que, aunque los captadores y definidores son una práctica común, no son obligatorios. En algunos casos, cuando la clase es muy simple y no requiere control adicional sobre sus campos, puede ser aceptable exponer los campos directamente. Sin embargo, esto debe hacerse con precaución y comprendiendo las consecuencias para la mantenibilidad y flexibilidad del código.
En resumen, los captadores y definidores son una parte crucial de la encapsulación en Java. Proporcionan una interfaz controlada para acceder y modificar los campos de una clase mientras mantienen la integridad y flexibilidad del código. Seguir las convenciones de nomenclatura de estos métodos es esencial para mantener la coherencia y garantizar la interacción adecuada con otras partes del ecosistema Java.