Java Bean に不変性を提供する可能性について非常に興味があります (ここでの Bean とは、メンバーにゲッターとセッターを提供する空のコンストラクターを持つクラスを意味します)。明らかに、これらのクラスは不変ではなく、データ層から値を転送するために使用される場所は、実際の問題のようです。
この問題に対する 1 つのアプローチは、StackOverflow で言及されている「C# の不変オブジェクト パターン」と呼ばれ、オブジェクトは完全にビルドされると凍結されます。私には別のアプローチがあり、それについて人々の意見を聞きたいと思っています。
パターンには Immutable と Mutable の 2 つのクラスが含まれ、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 ごとに明らかに大量のボイラープレートがあります。
この問題に対する他の人々のアプローチを聞くことに非常に興味があります。(良い質問を提供していないことをお詫びします。議論するのではなく、答えることができます:)