2

タイプ「オブジェクト」のメンバーを持つオブジェクトがあります。

class MyObject{
    Object member;

    public Object getObject(){
        return member;
     }

     public void setObject(Object obj){
         member = obj;
     }
}

ディープコピーは可能MyObjectですか?

4

3 に答える 3

10

現在の実装ではmember、何にでもなる可能性があり、知らないもののコピーを作成できないため、不可能です。

于 2013-06-11T06:38:26.190 に答える
0

これは Bean であるため不変ではありませんが、別の方法があります:凍結/解凍パターンです。

オブジェクトに実装する場合(ビルダークラスを使用する必要があります)、次のことができます。

final MyObject copy = orig.thaw().freeze();

Cloneableビルダー (これはリバーシブル ビルダーです)よりもはるかに便利で、そのパターンをよく使用します。

おまけとして、オブジェクトを Bean ではなく、したがって不変にすることができます。私は個人的に豆が大嫌いなので、それを思いつきました...

そして、このパターンも再帰的です。クラスがOutあり、InwhereInが のメンバーであるとしますOutIn凍結/解凍に従うとしましょう。その後のコードは次の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

于 2013-06-11T06:38:17.863 に答える