我非常好奇为java bean提供不可变性的可能性(这里的bean指的是具有为构造成员提供getter和setter的空构造函数的类)。很明显,这些类不是不可变的,它们被用来从数据层传输值,这似乎是一个真正的问题。Java中的不可变bean
这个问题的一种方法在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显然有大量的样板。
我非常有兴趣听到别人解决这个问题的方法。 (我不提供一个很好的问题,这都可以回答,而不是讨论:)
感谢您的意见。我同意复制构造函数是对接口工厂方法的重大改进。关于最终成员的说明很好。干杯。 – 2008-11-21 00:44:52