La encapsulación es uno de los principios fundamentales de la programación orientada a objetos (OOP). Se refiere a la práctica de restringir el acceso directo a algunos de los componentes de un objeto y solo permitir su modificación a través de métodos definidos. Esto ayuda a proteger el estado interno del objeto y a mantener la integridad de los datos.
Conceptos Clave de la Encapsulación
-
Modificadores de Acceso: Los modificadores de acceso controlan la visibilidad de las variables y métodos de una clase. Los más comunes son:
public: Accesible desde cualquier lugar.private: Accesible solo dentro de la misma clase.protected: Accesible dentro de la misma clase, subclases y clases del mismo paquete.default(sin modificador): Accesible solo dentro del mismo paquete.
-
Getters y Setters: Métodos que permiten acceder y modificar los atributos privados de una clase.
- Getter: Método que devuelve el valor de un atributo.
- Setter: Método que establece el valor de un atributo.
Ejemplo Práctico
Vamos a crear una clase Persona que utiliza la encapsulación para proteger sus atributos.
Definición de la Clase Persona
class Persona {
private String nombre
private int edad
// Constructor
Persona(String nombre, int edad) {
this.nombre = nombre
this.edad = edad
}
// Getter para nombre
String getNombre() {
return nombre
}
// Setter para nombre
void setNombre(String nombre) {
this.nombre = nombre
}
// Getter para edad
int getEdad() {
return edad
}
// Setter para edad
void setEdad(int edad) {
if (edad > 0) {
this.edad = edad
} else {
println "La edad debe ser un número positivo."
}
}
}Uso de la Clase Persona
def persona = new Persona("Juan", 25)
// Accediendo a los atributos a través de getters
println "Nombre: ${persona.getNombre()}"
println "Edad: ${persona.getEdad()}"
// Modificando los atributos a través de setters
persona.setNombre("Carlos")
persona.setEdad(30)
println "Nombre actualizado: ${persona.getNombre()}"
println "Edad actualizada: ${persona.getEdad()}"
// Intentando establecer una edad negativa
persona.setEdad(-5) // Esto imprimirá un mensaje de errorExplicación del Código
-
Atributos Privados: Los atributos
nombreyedadestán declarados comoprivate, lo que significa que no pueden ser accedidos directamente desde fuera de la clasePersona. -
Constructor: El constructor inicializa los atributos
nombreyedadcuando se crea una nueva instancia dePersona. -
Getters y Setters: Los métodos
getNombre,setNombre,getEdadysetEdadpermiten acceder y modificar los atributos privados de manera controlada. El settersetEdadincluye una validación para asegurarse de que la edad sea un número positivo.
Ejercicio Práctico
Ejercicio 1: Implementar Encapsulación en una Clase CuentaBancaria
Crea una clase CuentaBancaria que tenga los siguientes atributos privados: numeroCuenta (String), saldo (double). Implementa los getters y setters necesarios, asegurándote de que el saldo no pueda ser negativo.
Solución
class CuentaBancaria {
private String numeroCuenta
private double saldo
// Constructor
CuentaBancaria(String numeroCuenta, double saldo) {
this.numeroCuenta = numeroCuenta
this.saldo = saldo >= 0 ? saldo : 0
}
// Getter para numeroCuenta
String getNumeroCuenta() {
return numeroCuenta
}
// Setter para numeroCuenta
void setNumeroCuenta(String numeroCuenta) {
this.numeroCuenta = numeroCuenta
}
// Getter para saldo
double getSaldo() {
return saldo
}
// Setter para saldo
void setSaldo(double saldo) {
if (saldo >= 0) {
this.saldo = saldo
} else {
println "El saldo no puede ser negativo."
}
}
}
// Uso de la clase CuentaBancaria
def cuenta = new CuentaBancaria("123456789", 1000.0)
println "Número de cuenta: ${cuenta.getNumeroCuenta()}"
println "Saldo: ${cuenta.getSaldo()}"
cuenta.setSaldo(1500.0)
println "Saldo actualizado: ${cuenta.getSaldo()}"
cuenta.setSaldo(-500.0) // Esto imprimirá un mensaje de errorRetroalimentación y Consejos
- Errores Comunes: Un error común es olvidar validar los datos en los setters, lo que puede llevar a estados inconsistentes en los objetos.
- Consejo: Siempre valida los datos en los setters para asegurarte de que los atributos de la clase mantengan valores válidos.
Conclusión
La encapsulación es una técnica esencial en la programación orientada a objetos que ayuda a proteger los datos y a mantener la integridad del estado de los objetos. Al utilizar modificadores de acceso y métodos getters y setters, puedes controlar cómo se accede y modifica el estado interno de un objeto. En el siguiente tema, exploraremos cómo la herencia permite reutilizar y extender el comportamiento de las clases en Groovy.
Curso de Programación Groovy
Módulo 1: Introducción a Groovy
Módulo 2: Sintaxis de Groovy y Características del Lenguaje
Módulo 3: Programación Orientada a Objetos en Groovy
Módulo 4: Características Avanzadas de Groovy
Módulo 5: Groovy en la Práctica
- Entrada/Salida de Archivos
- Trabajando con XML y JSON
- Acceso a Bases de Datos
- Desarrollo Web con Groovy
Módulo 6: Pruebas y Depuración
Módulo 7: Ecosistema y Herramientas de Groovy
- Herramienta de Construcción Gradle
- Framework de Pruebas Spock
- Framework Grails
- Otras Bibliotecas y Herramientas de Groovy
Módulo 8: Mejores Prácticas y Temas Avanzados
- Estilo de Código y Convenciones
- Optimización del Rendimiento
- Consideraciones de Seguridad
- Concurrencia en Groovy
