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,publicydefault. - 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
nombreyedadestá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,getEdadysetEdadpermiten 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
