我很好奇为 java bean 提供不变性的可能性(这里的 bean 是指具有为成员提供 getter 和 setter 的空构造函数的类)。显然,这些类不是不可变的,它们用于从数据层传输值,这似乎是一个真正的问题。
StackOverflow 中提到了一种解决此问题的方法,称为“C# 中的不可变对象模式”,其中对象在完全构建后被冻结。我有另一种方法,真的很想听听人们对此的看法。
该模式涉及两个类 Immutable 和 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;
}
}
这种方法允许使用反射(通过通常的约定)构建 bean,并且还允许我们在最近的机会转换为不可变的变体。不幸的是,每个 bean 显然有大量的样板。
我很想听听其他人对这个问题的看法。(我很抱歉没有提供一个好的问题,可以回答而不是讨论:)