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

  1. 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.
  2. 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

  1. Atributos Privados: Los atributos nombre y edad están declarados como private, lo que significa que no pueden ser accedidos directamente desde fuera de la clase Persona.

  2. Constructor: El constructor inicializa los atributos nombre y edad cuando se crea una nueva instancia de Persona.

  3. Getters y Setters: Los métodos getNombre, setNombre, getEdad y setEdad permiten acceder y modificar los atributos privados de manera controlada. El setter setEdad 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.

© Copyright 2024. Todos los derechos reservados