Мне очень любопытно, что можно предоставить неизменность для java beans (здесь я имею в виду классы с пустым конструктором, предоставляющим геттеры и сеттеры для участников). Очевидно, что эти классы не являются неизменными и где они используются для переноса значений из уровня данных, это кажется реальной проблемой.Неизменяемые бобы в Java
Один из подходов к этой проблеме упоминается здесь в StackOverflow под названием «Необязательный шаблон объекта в C#», где объект заморожен после полной сборки. У меня есть альтернативный подход, и мне бы очень хотелось услышать мнения людей по этому поводу.
Образец включает в себя два класса Неизменяемый и Mutable, где Mutable и Immutable реализуют интерфейс, который обеспечивает не мутирующие bean-методы.
Например
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;
}
}
Такой подход позволяет боб быть построены с помощью отражения (с помощью обычных соглашений), а также позволяет конвертировать неизменного вариант в ближайшей возможности. К сожалению, очевидно, что существует большое количество шаблонов для каждого компонента.
Мне очень интересно услышать подход других людей к этой проблеме. (Мои извинения за не обеспечивает хороший вопрос, на который можно ответить, а не обсуждали :)
Спасибо за ваши комментарии. Я согласен с тем, что конструктор копирования является существенным улучшением по сравнению с заводскими методами интерфейса. Замечание о конечных членах хорошо взято. Приветствия. – 2008-11-21 00:44:52