SLIDE 1 / 5

1. El Constructor: La Aduana de los Invariantes

Un invariante es una regla de negocio que NUNCA debe violarse (ej. una nota entre 0 y 10, un saldo no negativo). El constructor es el guardián fronterizo: si los datos son inválidos, los reemplaza por un valor por defecto seguro y avisa por consola. El objeto siempre nace en el Heap, pero nunca con datos rotos.

Parámetros nombre: "Ana" nota: 9 Aduana nota >= 0 && nota <= 10 ✓ OK Estudiante Vivo nombre: "Ana" nota: 9 Estado Válido
Prueba de Argumentos
Sentencia new: new Estudiante("Ana", 9);
Resultado del Constructor: Instancia Creada en Heap

La nota cumple el invariante (0 a 10). El objeto nace con garantía absoluta de integridad.

2. Sobrecarga y Delegación de Constructores con this()

Tener múltiples constructores no significa duplicar las validaciones. Con this(...), los constructores secundarios delegan en cascada hacia el constructor canónico principal. Regla estricta de Java: this() debe ser la primera sentencia.

Libro(String tit) this(tit, "Anónimo"); Libro(String tit, String aut) this(tit, aut, 0.0); CONSTRUCTOR CANÓNICO Libro(tit, aut, precio) if (precio < 0) precio = 0; this.titulo = tit; this.autor = aut; this.precio = precio;
Rastreador de Invocación
Paso 1: Libro("Quijote") invoca a this()
Paso 2: Libro("Quijote", "Anónimo")
Llegada final: Constructor Canónico (3 args)

Las validaciones residen en UN solo lugar. Si cambian las reglas de precio, no tenés que retocar 3 constructores.

3. La Matriz de los 4 Modificadores de Acceso

Java ofrece 4 niveles concéntricos de visibilidad. La regla de oro del encapsulamiento es el Principio del Menor Privilegio: empezá siempre con private y abrí visibilidad solo si hay una razón de diseño estricta.

Modificador Misma Clase Mismo Paquete Subclase Mundo private ✓ SÍ ✕ NO ✕ NO ✕ NO default ✓ SÍ ✓ SÍ ✕ NO ✕ NO protected ✓ SÍ ✓ SÍ ✓ SÍ ✕ NO public ✓ SÍ ✓ SÍ ✓ SÍ ✓ SÍ
Explorador de Alcance
Nivel seleccionado: private (Máximo Blindaje)
Acceso externo: Bloqueado para todo lo que no sea la clase

Ideal para los atributos de estado. Ninguna clase externa puede leer o escribir directamente.

4. La Fuga de Referencia (Reference Leak)

Marcar un atributo como private NO garantiza encapsulamiento si el getter devuelve la referencia directa a un objeto mutable (como un array o Date). El código cliente puede corromper tu array interno sin tocar ningún setter.

HistorialMedico private String[] consultas; ["Gripe", "Control", "Rayos"] 3 Consultas Activas Código Externo h.getConsultas()[0] = null; ¡Ataque exitoso sin setter!
Simulador de Blindaje
Código del Getter: return this.consultas;
Resultado del ataque: Posición 0 sobrescrita con null

Al devolver la referencia original, el encapsulamiento se destruyó. El cliente corrompió la historia clínica.

5. Inmutabilidad: El Encapsulamiento Perfecto

Una clase inmutable (como String, LocalDate o un record de Java 16+) no expone setters y declara sus campos private final. Es inmune a condiciones de carrera en entornos multihilo porque su estado jamás muta tras salir del constructor.

record Coordenada(x, y) final double x = 12.5; final double y = 48.2; 🔒 SIN SETTERS (Thread-Safe) Hilo A: Lee x=12.5 Hilo B: Lee y=48.2 Hilo C: Lee x=12.5
Ventajas de la Inmutabilidad
Seguridad en Concurrencia: 100% Thread-Safe
Efectos Colaterales: Cero (Zero)
Uso como clave en Map: Ideal e Inalterable

Al diseñar con inmutabilidad, eliminás de raíz clases enteras de bugs: carreras de datos, aliasing accidental y corrupción de estado.