El encapsulamiento 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. El encapsulamiento 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.

Conceptos Clave

  1. Encapsulamiento: Proceso de ocultar los detalles internos de un objeto y exponer solo lo necesario a través de métodos públicos.
  2. Modificadores de Acceso: Palabras clave que controlan el acceso a las clases, métodos y variables. Los más comunes son private, protected, public y default.
  3. Getters y Setters: Métodos públicos que permiten acceder y modificar los atributos privados de una clase.

Beneficios del Encapsulamiento

  • Control de Acceso: Permite controlar cómo se accede y modifica el estado interno de un objeto.
  • Mantenimiento: Facilita la modificación del código sin afectar a otras partes del programa.
  • Seguridad: Protege los datos de modificaciones no autorizadas o no intencionadas.
  • Flexibilidad: Permite cambiar la implementación interna sin cambiar la interfaz pública.

Ejemplo Práctico

Definición de una Clase con Encapsulamiento

Vamos a definir una clase Persona que encapsula sus atributos nombre y edad.

public class Persona {
    // Atributos privados
    private String nombre;
    private int edad;

    // Constructor
    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    // Métodos getter y setter para nombre
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // Métodos getter y setter para edad
    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        if (edad > 0) { // Validación simple
            this.edad = edad;
        }
    }

    // Método para mostrar información
    public void mostrarInfo() {
        System.out.println("Nombre: " + nombre + ", Edad: " + edad);
    }
}

Uso de la Clase Persona

public class Main {
    public static void main(String[] args) {
        // Crear un objeto de la clase Persona
        Persona persona = new Persona("Juan", 25);

        // Acceder a los atributos a través de los métodos getter
        System.out.println("Nombre: " + persona.getNombre());
        System.out.println("Edad: " + persona.getEdad());

        // Modificar los atributos a través de los métodos setter
        persona.setNombre("Carlos");
        persona.setEdad(30);

        // Mostrar la información actualizada
        persona.mostrarInfo();
    }
}

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.
  2. Getters y Setters: Los métodos getNombre, setNombre, getEdad y setEdad permiten acceder y modificar los atributos privados de manera controlada.
  3. Validación: En el método setEdad, se incluye una validación simple para asegurarse de que la edad sea positiva antes de asignarla.

Ejercicio Práctico

Ejercicio 1: Implementar Encapsulamiento

Crea una clase CuentaBancaria que tenga los siguientes atributos privados: numeroCuenta, saldo y titular. Implementa los métodos getter y setter para cada atributo y un método depositar y retirar para modificar el saldo.

Solución

public class CuentaBancaria {
    private String numeroCuenta;
    private double saldo;
    private String titular;

    // Constructor
    public CuentaBancaria(String numeroCuenta, double saldo, String titular) {
        this.numeroCuenta = numeroCuenta;
        this.saldo = saldo;
        this.titular = titular;
    }

    // Getters y Setters
    public String getNumeroCuenta() {
        return numeroCuenta;
    }

    public void setNumeroCuenta(String numeroCuenta) {
        this.numeroCuenta = numeroCuenta;
    }

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    public String getTitular() {
        return titular;
    }

    public void setTitular(String titular) {
        this.titular = titular;
    }

    // Métodos para depositar y retirar dinero
    public void depositar(double cantidad) {
        if (cantidad > 0) {
            saldo += cantidad;
        }
    }

    public void retirar(double cantidad) {
        if (cantidad > 0 && cantidad <= saldo) {
            saldo -= cantidad;
        }
    }

    // Método para mostrar información de la cuenta
    public void mostrarInfo() {
        System.out.println("Número de Cuenta: " + numeroCuenta + ", Titular: " + titular + ", Saldo: " + saldo);
    }
}

Uso de la Clase CuentaBancaria

public class Main {
    public static void main(String[] args) {
        // Crear un objeto de la clase CuentaBancaria
        CuentaBancaria cuenta = new CuentaBancaria("123456789", 1000.0, "Ana");

        // Mostrar información inicial
        cuenta.mostrarInfo();

        // Depositar dinero
        cuenta.depositar(500.0);
        cuenta.mostrarInfo();

        // Retirar dinero
        cuenta.retirar(200.0);
        cuenta.mostrarInfo();
    }
}

Conclusión

El encapsulamiento es una práctica esencial en la programación orientada a objetos que ayuda a proteger los datos y a mantener el código modular y fácil de mantener. Al utilizar modificadores de acceso y métodos getter y setter, podemos controlar cómo se accede y modifica el estado interno de un objeto, mejorando la seguridad y la flexibilidad del código.

En el siguiente tema, exploraremos la abstracción, otro pilar fundamental de la POO, que nos permitirá diseñar clases y métodos más generales y reutilizables.

Curso de Programación en Java

Módulo 1: Introducción a Java

Módulo 2: Flujo de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Programación Orientada a Objetos Avanzada

Módulo 5: Estructuras de Datos y Colecciones

Módulo 6: Manejo de Excepciones

Módulo 7: Entrada/Salida de Archivos

Módulo 8: Multihilo y Concurrencia

Módulo 9: Redes

Módulo 10: Temas Avanzados

Módulo 11: Frameworks y Librerías de Java

Módulo 12: Construcción de Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados