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.