Verificamos completamente cada tutoriales en nuestro espacio con el objetivo de enseñarte en todo momento información certera y certera.
Solución:
Su clase no es inmutable estrictamente hablando, solo es efectivamente inmutable. Para hacerlo inmutable, necesitas usar final
:
private final String name;
private final String age;
Aunque la diferencia puede parecer sutil, puede marcar una diferencia significativa en un contexto de subprocesos múltiples. Una clase inmutable es intrínsecamente segura para subprocesos, una clase efectivamente inmutable es segura para subprocesos solo si se publica de forma segura.
Hay algunas cosas que debe considerar para hacer una clase inmutable:
- Haz tu clase
final
– Tu ya lo tienes - Haz todos los campos
private
yfinal
– Realice los cambios apropiados en su código - No proporcione ningún método que cambie el estado de su instancia
- Si tiene campos mutables en su clase, como
List
oDate
haciéndolosfinal
no será suficiente. Debe devolver una copia defensiva de sugetters
para que su estado no se altere al llamar a los métodos.
Para el cuarto punto, digamos que tienes un Date
campo en su clase, entonces el getter para ese campo debería verse así:
public Date getDate()
return new Date(this.date.getTime());
Hacer una copia defensiva puede convertirse en un dolor de cabeza, cuando su propio campo mutable se compone de algún campo mutable, y eso a su vez puede contener algún otro campo mutable. En ese caso, necesitaría hacer una copia de cada uno de ellos de forma iterativa. Llamamos a esta copia iterativa de campos mutables como Copia profunda.
Implementar una copia profunda por su cuenta puede ser engorroso. Pero, manteniendo ese problema aparte, deberías considerar el diseño de tu clase nuevamente, una vez que te veas cayendo en tal requisito de hacer una copia defensiva profunda.
- Declare la clase como final para que no se pueda extender.
- Haga que todos los campos sean privados para que no se permita el acceso directo.
- No proporcione métodos setter para variables
- Haga que todos los campos mutables sean finales para que su valor se pueda asignar solo una vez.
- Inicialice todos los campos a través de un constructor que realice una copia profunda.
- Realice la clonación de objetos en los métodos getter para devolver una copia en lugar de devolver la referencia del objeto real.
fuente
Recuerda algo, que tienes la capacidad de añadir una tasación si te fue de ayuda.