Final vs inmutable en Java: No son lo mismo

Published: (December 26, 2025 at 11:30 PM EST)
1 min read
Source: Dev.to

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 private y final.
  • No incluyas setters.
  • Si expones datos mutables, devuelve copias defensivas o colecciones inmutables (por ejemplo, List.copyOf en 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.

Back to Blog

Related posts

Read more »

My TicketDesk System

Intro For my Intro to Programming module, I made a TicketDesk system in Java that can: - Track tickets - Track login information - Provide a role‑based authent...