我非常好奇爲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