Final vs inmutable en Java: No son lo mismo
Source: Dev.to
Conceptos clave
Final: bloquea la reasignación de la referencia, no el contenido. Puedes seguir manipulando el objeto si es mutable.
Inmutable: el objeto no cambia después de su construcción. No expone mutadores y, si tiene colecciones, no permite modificarlas desde fuera.
Ejemplos
final aplicado a una colección mutable
final List items = new ArrayList<>();
items.add("alpha"); // OK
// items = new ArrayList<>(); // Error: cannot assign a value to final variable
Clase inmutable real
public final class UserId {
private final String value;
public UserId(String value) {
this.value = value;
}
public String value() {
return value;
}
}
Una clase así no expone mutadores y su estado queda fijado al construirla.
Cómo lograr inmutabilidad real
- Declara los campos como
privateyfinal. - No incluyas setters.
- Si expones datos mutables, devuelve copias defensivas o colecciones inmutables (por ejemplo,
List.copyOfen Java 10+).
Acción recomendada
Revisa una API que devuelva una List mutable. Ajusta el método para devolver una colección inmutable o una copia y añade una prueba que verifique que la lista no puede ser alterada por el consumidor. Con este ajuste se gana claridad, seguridad y menos sorpresas en producción.