2

I have an object with a member of type "Object":

class MyObject{
    Object member;

    public Object getObject(){
        return member;
     }

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

Is it possible to deep copy MyObject?

4

3 回答 3

10

在当前的实现中,这是不可能的,因为它member可以是任何东西,你不能复制你不知道的东西。

于 2013-06-11T06:38:26.190 回答
3

实现标记接口,您可以通过克隆Cloneable复制。MyObject

class MyObject implements Cloneable {
    public Object clone(){
      try {
        return super.clone();
      } catch (CloneNotSupportedException e) {
           return null; 
      }
   }
}

会员还需要Cloneable其他的,否则它会抛出CloneNotSupportedException。...

MyObject obj = new MyObject();
MyObject obj1 = obj.clone();
于 2013-06-11T06:33:46.173 回答
0

即使它是一个 bean,因此不是一成不变的,我也有一个替代方案:冻结/解冻模式

如果您为您的对象实现它(这将需要您使用构建器类),您可以执行以下操作:

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

Cloneable我发现它甚至比构建器(这是一个可逆的构建器)更方便,并且经常使用这种模式。

作为奖励,您可以使您的对象不是 bean,因此是不可变的。我个人对豆类有一种深深的厌恶,这就是我想出那个的原因……

而且这种模式也是递归的。让我们假设您有类OutIn其中In的成员是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.

于 2013-06-11T06:38:17.863 回答