Nivel 1 · 15 min
Encapsulación
La encapsulación es el principio OOP de ocultar los detalles de implementación internos de un objeto y exponer solo lo necesario a través de una interfaz pública. Protege la integridad de los datos y permite cambiar la implementación sin afectar al cliente.
Modificadores de acceso
Java tiene cuatro modificadores: private (solo la clase), default/package-private (el paquete), protected (subclases + paquete) y public (todos). La regla de oro es usar el modificador más restrictivo posible. Un campo private protegido por métodos públicos permite validar, calcular y notificar en los setters. Un campo public es accesible sin control — cualquier código externo puede poner cualquier valor.
Information Hiding e invariantes
Information Hiding va más allá de private — se trata de no exponer cómo funciona algo, sino qué hace. Los invariantes son condiciones que siempre deben cumplirse (edad '>' 0, saldo '>'= límite de crédito). La encapsulación permite que la clase proteja sus invariantes — si el campo saldo es public, cualquiera puede romper el invariante. Si es private con un método setSaldo() con validación, la clase garantiza la condición.
Getters, Setters y el debate
Getters y setters son una forma de encapsulación, pero no la única. Un objeto con solo getters/setters no encapsula — expone todos sus datos de todas formas. La encapsulación real implica diseñar la API del objeto en términos de comportamiento, no de datos. En lugar de getEstado()/setEstado(), preferís activar()/desactivar()/esPendiente(). La diferencia: el objeto controla sus propias transiciones de estado.
Code example
// Encapsulacion real: el objeto protege sus invariantes
class BankAccount {
private BigDecimal balance;
private final BigDecimal creditLimit;
void debit(BigDecimal amount) {
if (balance.subtract(amount).compareTo(creditLimit.negate()) < 0)
throw new InsufficientFundsException();
balance = balance.subtract(amount);
}
}