Mutabilidad e inmutabilidad en Java

En Java, como sucede en muchos de los lenguajes de programación de alto nivel, los objetos, valores y las funciones pueden ser de dos tipos: mutables e inmutables,

Qué es inmutabilidad

Cuando se dice que un valor es inmutable, esto significa que no puede cambiar.

Es decir, si se quiere realizar algún cambio en su valor, se tiene que crear otro objeto, ya que el objeto original se mantiene tal cual

Por ejemplo, en Java los Strings por default son inmutables.

String title = "hello";

Para que un valor de cualquier tipo sea inmutable, lo único que se debe hacer es agregar la palabra reservada final:

class Client {
    
		// Atributos de la función de tipo final
    private final String name;
    private final String lastName;
    private final long id;

    public Client(String name, String lastName, int id) {
			this.name = name;
			this.lastName = lastName;
			this.id = id;
		}
}

También a los valores inmutables de tipo final se les conoce como constantes. Aunque en el caso de Java, normalemnte también se le conocen como constante a las variables de tipo de variables inmutables definidas en los atributos.

Para declarar una constante, se debe seguir la siguiente estructura

Tipo_de_datos static final nombre_identificador = valor

Por ejemplo, el caso de una constante llamada PI , sería así:

static double final PI = 3.141592;

Las clases ¿son inmutables?

Por default, todas las clases tienen un comportamiento mutables, es decir, se pueden sobreescribir. Sin embargo, como sucede con los valores, si se desea crear una clase inmutable, solo hay que agregar la palabra reservada final:

// La clase con "final" hace que se vuelva inmutable

final class Employee {
    
    private final String name;
    private final String lastName;
    private final long id;

    public Employee(String name, String lastName, int id) {
			this.name = name;
			this.lastName = lastName;
			this.id = id;
		}
}

¿Para qué se usan?

Las clases inmutables suelen usarse en los siguientes casos:

  • Cuando se quiere que la clase no pueda heredar a una subclase.
  • Para crear objetos completamente inmutables.
  • Evitar problemas de sobreescritura en tiempo de ejecución.

Cuándo se usa la inmutabilidad

Las inmutabilidad tiene muchos usos, en especial cuando se trabaja con programas concurrentes que requieran multithreating.

En cuanto a las variables, la inmutabilidad es usada ampliamente para definir constantes, es decir, valores que no cambian.

Por último, como se mencionó al inicio,  por default los Strings o cadenas de caracteres son inmutable, por lo tanto, es imposible cambiar un valor dentro de un String dado. Sin embargo, en el caso de que se requiera crear una cadena de tipo mutable, se pueden usar clases como StringBuilder().

TaggedInmutabilidad