Objetos inmutables son aquellos cuyos estados no se pueden cambiar después de ser creados. Sus principales características son:
Ventajas de los objetos inmutables:
Ejemplo de implementación de una clase inmutable:
public final class Person { private final String name; private final int age; private final List<String> phones; public Person(String name, int age, List<String> phones) { this.name = name; this.age = age; // Protección contra la mutación de la lista pasada this.phones = Collections.unmodifiableList(new ArrayList<>(phones)); } public String getName() { return name; } public int getAge() { return age; } public List<String> getPhones() { return phones; } // Devolvemos una lista de solo lectura }
¿Por qué String en Java es inmutable y qué pasaría si no fuera así? Muchos responden "por seguridad", pero ¿qué significa esto en la práctica?
Respuesta:
String se utiliza en muchos lugares: como claves en colecciones, en lógica de seguridad (por ejemplo, contraseñas). Si se pudiera cambiar una cadena a través de una referencia, afectaría a todas las demás referencias al mismo objeto, lo que haría imposible que las colecciones funcionaran correctamente (por ejemplo, HashMap — al calcular hashCode) y podría conducir a vulnerabilidades de seguridad.
Historia
Collections.unmodifiableList.Historia
Date, List). En uno de los hilos, se modificó la configuración, y en el segundo se obtuvieron datos obsoletos o inconsistentes, lo que hizo que un algoritmo de negocio funcionara de forma incorrecta.Historia
En el sistema de inicio de sesión, las contraseñas se almacenaban en un objeto mutable. A través de un acceso no seguro, de repente "se filtró" la contraseña de otro usuario, ya que el mismo objeto se utilizaba por muchos hilos.