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 error
Explicación del Código
-
Atributos Privados: Los atributos
nombre
yedad
están declarados comoprivate
, lo que significa que no pueden ser accedidos directamente desde fuera de la clasePersona
. -
Constructor: El constructor inicializa los atributos
nombre
yedad
cuando se crea una nueva instancia dePersona
. -
Getters y Setters: Los métodos
getNombre
,setNombre
,getEdad
ysetEdad
permiten acceder y modificar los atributos privados de manera controlada. El settersetEdad
incluye 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 error
Retroalimentació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