タイプ「オブジェクト」のメンバーを持つオブジェクトがあります。
class MyObject{
Object member;
public Object getObject(){
return member;
}
public void setObject(Object obj){
member = obj;
}
}
ディープコピーは可能MyObject
ですか?
現在の実装ではmember
、何にでもなる可能性があり、知らないもののコピーを作成できないため、不可能です。
これは Bean であるため不変ではありませんが、別の方法があります:凍結/解凍パターンです。
オブジェクトに実装する場合(ビルダークラスを使用する必要があります)、次のことができます。
final MyObject copy = orig.thaw().freeze();
Cloneable
ビルダー (これはリバーシブル ビルダーです)よりもはるかに便利で、そのパターンをよく使用します。
おまけとして、オブジェクトを Bean ではなく、したがって不変にすることができます。私は個人的に豆が大嫌いなので、それを思いつきました...
そして、このパターンも再帰的です。クラスがOut
あり、In
whereIn
が のメンバーであるとしますOut
。In
凍結/解凍に従うとしましょう。その後のコードは次のOut
ようになります。
public final class Out
implements Frozen<Builder>
{
private final In in;
private Out(final Builder builder)
{
in = builder.in.freeze();
}
public static newBuilder()
{
return new Builder();
}
public In getIn()
{
return in;
}
@Override
public Builder thaw()
{
return new Builder(this);
}
public static final class Builder
implements Thawed<Out>
{
private In.Builder in;
private Builder()
{
}
private Builder(final Out out)
{
in = out.in.thaw();
}
public Builder setIn(final In in)
{
this.in = in.thaw();
}
@Override
public Out freeze()
{
return new Out(this);
}
}
}
最終的な結果として、 を呼び出すと、 の新しいインスタンスを持つ同一のコピーcopy = orig.thaw().frezze()
が返されます。in