Encapsulación Java
La encapsulación es un principio fundamental de la programación orientada a objetos (POO) en Java que consiste en agrupar los datos (variables) y los métodos (funciones) que operan sobre los datos en una sola unidad, conocida como clase. Restringe el acceso directo a algunos de los componentes de un objeto y puede evitar la modificación accidental de datos.
Finalidad de la encapsulación
- Ocultar datos: La encapsulación permite ocultar al exterior la representación interna de un objeto. Sólo se exponen los detalles necesarios a través de una interfaz pública.
- Mayor flexibilidad: Al controlar el acceso a los campos de una clase, puedes cambiar la implementación interna sin afectar al código externo que utiliza la clase.
- Mantenimiento mejorado: La encapsulación ayuda a mantener el código manteniendo los campos privados y proporcionando métodos getter y setter públicos para modificar y ver los campos.
Implementar la encapsulación en Java
Para lograr la encapsulación en Java:
- Declara las variables de clase como
private
. - Proporciona los métodos getter y setter de
public
para acceder y actualizar el valor de una variable privada.
Ejemplo 1: Encapsulación básica
public class Student {
private String name;
private int age;
// Getter method for name
public String getName() {
return name;
}
// Setter method for name
public void setName(String name) {
this.name = name;
}
// Getter method for age
public int getAge() {
return age;
}
// Setter method for age
public void setAge(int age) {
if (age > 0) {
this.age = age;
}
}
}
En este ejemplo, la clase Student
tiene los campos privados name
y age
. Se proporcionan métodos públicos getter y setter para acceder a estos campos y modificarlos. El configurador de age
incluye una comprobación de validación básica.
Ejemplo 2: Encapsulación con validación
public class BankAccount {
private double balance;
// Getter method for balance
public double getBalance() {
return balance;
}
// Setter method for balance with validation
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
}
}
}
La clase BankAccount
encapsula el campo balance
. Proporciona los métodos deposit
y withdraw
para modificar la balanza, garantizando que sólo se realizan operaciones válidas.
Consejos y buenas prácticas
- Utiliza campos privados: Declara siempre los campos de clase como
private
para protegerlos de modificaciones externas. - Proporciona métodos de acceso: Utiliza los métodos getter y setter de
public
para controlar el acceso a los campos. Esto permite la validación y la flexibilidad para cambiar la implementación interna. - Lógica de validación: Implementa una lógica de validación en los métodos setter para garantizar que el estado del objeto sigue siendo coherente.
- Clases inmutables: Considera hacer las clases inmutables (sin setters) si el estado del objeto no debe cambiar tras su creación. Esto mejora la seguridad y simplifica la programación concurrente.