Tengo mucha curiosidad sobre la posibilidad de proporcionar inmutabilidad para beans Java (por beans me refiero a clases con un constructor vacío que proporciona getters y setters para miembros). Claramente estas clases no son inmutables y cuando se usan para transportar valores desde la capa de datos, esto parece ser un problema real.Frijoles inmutables en Java
Un enfoque a este problema se ha mencionado aquí en StackOverflow llamado "Patrón de objetos inmutables en C#" donde el objeto se congela una vez que se ha construido por completo. Tengo un enfoque alternativo y me gustaría escuchar las opiniones de las personas al respecto.
El patrón implica dos clases Inmutable y Mutable donde Mutable e Immutable implementan una interfaz que proporciona métodos de bean no mutantes.
Por ejemplo
public interface DateBean {
public Date getDate();
public DateBean getImmutableInstance();
public DateBean getMutableInstance();
}
public class ImmutableDate implements DateBean {
private Date date;
ImmutableDate(Date date) {
this.date = new Date(date.getTime());
}
public Date getDate() {
return new Date(date.getTime());
}
public DateBean getImmutableInstance() {
return this;
}
public DateBean getMutableInstance() {
MutableDate dateBean = new MutableDate();
dateBean.setDate(getDate());
return dateBean;
}
}
public class MutableDate implements DateBean {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public DateBean getImmutableInstance() {
return new ImmutableDate(this.date);
}
public DateBean getMutableInstance() {
MutableDate dateBean = new MutableDate();
dateBean.setDate(getDate());
return dateBean;
}
}
Este enfoque permite que el grano que se construirá utilizando la reflexión (por las convenciones habituales) y también nos permite convertir una variante inmutable en la oportunidad más cercana. Desafortunadamente, existe claramente una gran cantidad de repetición por frijol.
Estoy muy interesado en escuchar el enfoque de otras personas sobre este tema. (Mis disculpas por no proporcionar una buena pregunta, que se puede responder más que discutido :)
Esa es una muy buena idea. Eso encaja el problema muy elegantemente. Saludos Chris. –
Si se trata de un objeto de fecha retenido en DateBean, tendrá que crear una nueva Fecha en get. De lo contrario, puede modificar la fecha a través de ImmutableDate.getDate(). Set .... – monksy