如何深度复制Object类型的对象?

时间:2016-01-31 22:38:46

标签: java object clone deep-copy

通常,当我深度复制对象时,我使用复制构造函数。对于我们的赋值,我们应该创建一个ObjectList,即使教师注意到这样的列表是不明智的。无论如何,当我向数组添加新的Object时,我遇到了一个问题。我试图在将对象添加到数组之前创建对象的深层副本以防止隐私泄露,但是Object类没有复制构造函数。例如,以下内容不起作用:

Object temp = new Object(insertObjectArgument);

然后我调查了Object.clone(),但看起来我应该尽可能远离它。 有什么方法可以深度复制Object类型的对象吗?

3 个答案:

答案 0 :(得分:1)

对于复杂的对象,当性能不显着时,我使用json库,如gson 将对象序列化为json文本,然后反序列化文本以获取新对象。

基于反射的gson在大多数情况下都有效,除了不会复制transient个字段和带有StackOverflow exception的循环引用的对象。

public static <ObjectType> ObjectType Copy(ObjectType AnObject, Class<ObjectType> ClassInfo)
{
    Gson gson = new GsonBuilder().create();
    String text = gson.toJson(AnObject);
    ObjectType newObject = gson.fromJson(text, ClassInfo);
    return newObject;
}
public static void main(String[] args)
{
    MyObject anObject ...
    MyObject copyObject = Copy(o, MyObject.class);

}

答案 1 :(得分:0)

Java没有用于深度复制的“神奇”实用程序。如果您关注的对象是选择支持that的类,则可以使用clone。但是,如果不阅读所有代码,就无法确定克隆方法的实现是否满足您的安全要求。否则,你必须以艰难的方式去做,从旧的对象图中构建一个新的对象图。

答案 2 :(得分:0)

您需要创建一个名为clone的方法,并使用@Override覆盖Object类附带的典型clone()方法。在此之后,创建一个新对象,并将旧对象中的数据复制到其中。放置/...意味着可以添加更多代码,或者您可以删除我最初放置的代码。

/**
 *  Explanation for http://stackoverflow.com/questions/35120424/how-to-deep-copy-an-object-of-type-object
 * 
 * @author Riley C
 * @version 1/31/16
 */
public class ObjectToReturn
{
    //variables
    int x;
    int y;
    // ...

    //constructor
    public ObjectToReturn()
    {
        x = 0;
        y = 0;
        // ...
    }

    //overrides
    @Override
    public ObjectToReturn clone()
    {
        ObjectToReturn returnMe = new ObjectToReturn();
        returnMe.setX(this.x);
        returnMe.setY(this.y);
        // ...
        return returnMe;
    }

    //methods
    public void setX(int x) {this.x = x;}
    public void setY(int y) {this.y = y;}
    // ...

    public int getX() {return x;}
    public int getY() {return y;}
    // ...
}

为什么不应该使用默认克隆

根据我的记忆,虽然clone()有时可以生成对象的深层副本,但它并不总是这样做。

习惯进入

良好的习惯我的大学讲师说他的公司喜欢看看是否确保你制作数组和对象的深层副本,以及覆盖equalsclonetoString方法通常带有Object类。这将允许您在对象上使用这些方法以及它们希望它们如何工作,而不是默认值,这些默认值可能会给出无意义的答案。它通常也更清晰,并且容易减少错误。