Skip to content

Inmutabilidad en Java

Published:

La inmutabilidad se define como algo que no puede cambiar una vez a sido creado, en Java, podemos relacionar la keyword final con el concepto de inmutabilidad, ya que, esta keyword permite que la declaración de la variable, método o clase sea definitiva.

Pero también existen tres tipos de inmutabilidad y estos tipos sólo se pueden relacionar con la declaración de clases y campos.

Inmutabilidad total

Basicamente toda la clase es inmutable desde la creación de la misma, es decir, que todos los métodos definidos en esta misma, no mutan ningun campo.

class Player {

    private String name;
    private int age;

    public Player(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // sólo getters

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

}

La implementación de la clase permite sólo la lectura de sus campos luego de haber sido creada, por lo tanto, se considera una clase con inmutabilidad total.

Inmutabilidad parcial

Crearemos un campo extra llamado score que será mutable.

class Player {

    private String name;
    private int age;
    private int score = 0;

    public Player(String name, int age) {
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public int getScore() {
        return this.score;
    }

}

Ahora la clase Player es inmutable de manera parcial, ya que, uno de sus campos puede cambiar su valor luego de haber sido creado, pero, algunos de sus campos siguen sin ser mutables.

Mutabilidad total

Imagino que ya puedes deducir que significa la mutabilidad total. Todos los campos de la clase son mutables, quiere decir que su valor puede cambiar.

class Player {

    private String name;
    private int age;
    private int score = 0;

    public Player(String name, int age) {
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        return this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        return this.age = age;
    }

    public void setScore(int score) { 
        this.score = score; 
    } 

    public int getScore() {
        return this.score; 
    } 

}

Ahora todos los campos de la clase Player pueden ser mutados.

Trabajando con inmutabilidad total

Si utilizamos la inmutabilidad deberemos trabajar con reasignaciones de objetos.


Player jugador = new Player("Miguel", 33);

// el jugador ahora debe tener otro nombre y la clase Player posee inmutabilidad total.

jugador = new Player("Miguelito", 12);

Al reasignar una nueva instancia de la clase Player a la variable jugador, estariamos respetando la inmutabilidad total.

Conclusión

La inmutabilidad es determinada por cuan modificable es el valor de una variable o clase. Los métodos no entran en esta categoría, ya que, no poseen un valor como tal, sin embargo, los métodos puedes ser sobreescritos (override) esto sería una forma de mutabilidad, y utilizando la keyword final se puede prohibir su sobreescritura.