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
- Encapsulamiento: Proceso de ocultar los detalles internos de un objeto y exponer solo lo necesario a través de métodos públicos.
- Modificadores de Acceso: Palabras clave que controlan el acceso a las clases, métodos y variables. Los más comunes son
private
,protected
,public
ydefault
. - 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
- Atributos Privados: Los atributos
nombre
yedad
están declarados comoprivate
, lo que significa que no pueden ser accedidos directamente desde fuera de la clase. - Getters y Setters: Los métodos
getNombre
,setNombre
,getEdad
ysetEdad
permiten acceder y modificar los atributos privados de manera controlada. - 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
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection