Мне очень интересно узнать о возможности обеспечения неизменности для Java-бинов (здесь под бинами я подразумеваю классы с пустым конструктором, предоставляющим методы получения и установки для членов). Очевидно, что эти классы не являются неизменяемыми, и когда они используются для передачи значений из уровня данных, это кажется реальной проблемой.
Один из подходов к этой проблеме был упомянут здесь в StackOverflow, который называется «Шаблон неизменяемого объекта в C #», где объект заморожен после полной сборки. У меня есть альтернативный подход, и я действительно хотел бы услышать мнение людей по этому поводу.
Шаблон включает в себя два класса Immutable и Mutable, где Mutable и Immutable оба реализуют интерфейс, который обеспечивает методы не изменяющего компонента.
Например
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;
}
}
Этот подход позволяет сконструировать бин с использованием отражения (по обычным соглашениям), а также позволяет нам преобразовать в неизменяемый вариант при ближайшей возможности. К сожалению, в каждом бобе явно большое количество шаблонов.
Мне очень интересно услышать подход других людей к этому вопросу. (Приношу свои извинения за то, что не дал хорошего вопроса, на который можно ответить, а не обсудить:)