Encapsulación Fundamentos OOP - Visibilidad, Information Hiding, private, protected, public
Este artículo es una explicación de conceptos sobre encapsulación en OOP, incluyendo preguntas de examen y etiquetas.
En Pocas Palabras
La encapsulación oculta los estados internos y detalles de implementación de un objeto, exponiendo únicamente interfaces bien definidas hacia el exterior. El objetivo es lograr software robusto, mantenible y seguro mediante límites claros de responsabilidad.
Descripción Técnica Compacta
La encapsulación es un principio central de OOP que agrupa datos y comportamiento en una unidad y restringe el acceso directo a las representaciones internas. Técnicamente se implementa mediante modificadores de visibilidad como private, protected, public, package, así como métodos de acceso y propiedades. Information Hiding reduce el acoplamiento, aumenta la cohesión y permite cambiar la implementación sin afectar a los consumidores. Los invariantes se mantienen dentro del objeto, las entradas y salidas se validan. La mutabilidad se gestiona deliberadamente, y los objetos inmutables eliminan categorías enteras de errores.
Puntos Relevantes para Exámenes
- Information Hiding protege la representación interna, reduce el acoplamiento
- Los modificadores de visibilidad private, protected, public, package controlan el acceso
- Los getters y setters no son un fin en sí mismo, solo se proporcionan cuando es necesario desde el punto de vista funcional
- Relevante para IHK, conceptos de encapsulación, abstracción, cohesión y acoplamiento deben diferenciarse correctamente
- Los objetos inmutables mejoran la seguridad en hilos y testabilidad en la práctica
- Validación, invariantes y la Ley de Demeter previenen manipulación insegura del estado
- Rentabilidad mediante reducción de costos de mantenimiento y refactoring más sencillo
- Obligación de documentación, interfaces públicas, precondiciones, postcondiciones
Componentes Clave
- Elementos del lenguaje para visibilidad, private, protected, public, package
- Propiedades y métodos, exposición dirigida en lugar de divulgación completa
- Invariantes, reglas funcionales que siempre deben cumplirse
- Contratos, precondiciones y postcondiciones en la API pública
- Concepto de mutabilidad, mutable, inmutable, Copy on Write
- Control de acceso y validación, verificar entradas, cambios de estado atómicos
- Paso de proceso, refactoring para ocultar campos de datos y colecciones internas
- Elemento arquitectónico, límites de módulo, límites de paquete, Bounded Contexts
- Aspecto de seguridad, minimización de superficie de ataque y puntos de inyección
- Procedimiento de prueba, tests de caja negra de la API y property-based tests para invariantes
Ejemplo Práctico
// Ejemplo, sintaxis similar a Java
class BankAccount {
private String iban
private int balanceInCents
public BankAccount(String iban) {
if (iban == null) throw new IllegalArgumentException("IBAN erforderlich")
this.iban = iban
this.balanceInCents = 0
}
public int balance() {
return balanceInCents
}
public void deposit(int cents) {
if (cents <= 0) throw new IllegalArgumentException("positiver Betrag")
balanceInCents += cents
}
public void withdraw(int cents) {
if (cents <= 0) throw new IllegalArgumentException("positiver Betrag")
if (cents > balanceInCents) throw new IllegalStateException("Überziehung nicht erlaubt")
balanceInCents -= cents
}
}
Explicación: Los campos son privados, solo las operaciones funcionalmente relevantes son públicas, los invariantes se validan.
Ventajas y Desventajas
Ventajas
- Menor acoplamiento, mayor cohesión
- Mejor mantenibilidad, refactoring más fácil
- Responsabilidades claras, seguridad mejorada mediante controles de entrada
Desventajas
- Posible sobrecarga de código repetitivo
- Un aislamiento excesivo puede dificultar la testabilidad
- Una inflación incorrecta de getters y setters puede socavar la encapsulación
Preguntas Típicas de Examen (con Respuesta Breve)
-
¿Diferencia entre encapsulación y abstracción? La encapsulación oculta los detalles de implementación tras una interfaz, la abstracción reduce la complejidad visible a las propiedades relevantes.
-
¿Niveles de visibilidad y su uso? private solo dentro de la clase, package solo dentro del paquete, protected clase y subclases, public visible globalmente.
-
¿Por qué son problemáticos los campos públicos? Evaden la validación, violan invariantes, aumentan el acoplamiento y hacen el refactoring arriesgado.
-
¿Cuándo tienen sentido los getters y setters? Cuando existe necesidad funcional, por ejemplo acceso de lectura o cambio controlado con validación, en caso contrario evitarlos.
-
¿Cómo la inmutabilidad respalda la encapsulación? Los objetos inmutables garantizan invariantes estables, simplifican el uso concurrente y previenen efectos secundarios.
-
¿Ley de Demeter y cómo ayuda? Habla solo con tus amigos directos, sin accesos encadenados, reduce el conocimiento sobre estructuras internas, fortalece la encapsulación.
-
¿Impacto en estrategias de prueba? Enfoque en tests de caja negra de la API pública, los detalles internos se verifican mediante comportamiento observable.
-
¿Romper encapsulación con colecciones? Devolver una List interna permite mutación externa, solución: copia defensiva o vista inmutable.
Fuentes Más Importantes
- https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
- https://de.wikipedia.org/wiki/Kapselung_(Programmierung)
- https://dl.acm.org/doi/10.1145/361598.361623
Continúa en la Ruta de Aprendizaje OOP
Todos los artículos de OOP están completos. Vuelve al primer artículo: Programación Orientada a Objetos Fundamentos OOP.



