如何在java中复制对象?

jtjikinw  于 2021-06-26  发布在  Java
关注(0)|答案(23)|浏览(434)

考虑以下代码:

DummyBean dum = new DummyBean();
dum.setDummy("foo");
System.out.println(dum.getDummy()); // prints 'foo'

DummyBean dumtwo = dum;
System.out.println(dumtwo.getDummy()); // prints 'foo'

dum.setDummy("bar");
System.out.println(dumtwo.getDummy()); // prints 'bar' but it should print 'foo'

所以,我想复制 dumdumtwo 和改变 dum 不影响 dumtwo . 但上面的代码并没有这样做。当我换衣服的时候 dum ,同样的变化也在发生 dumtwo 也。
我想,当我说 dumtwo = dum ,java只复制引用。那么,有没有办法创造一个新的 dum 并分配给 dumtwo ?

hts6caw3

hts6caw316#

public class MyClass implements Cloneable {

private boolean myField= false;
// and other fields or objects

public MyClass (){}

@Override
public MyClass clone() throws CloneNotSupportedException {
   try
   {
       MyClass clonedMyClass = (MyClass)super.clone();
       // if you have custom object, then you need create a new one in here
       return clonedMyClass ;
   } catch (CloneNotSupportedException e) {
       e.printStackTrace();
       return new MyClass();
   }

  }
}

在你的代码里:

MyClass myClass = new MyClass();
// do some work with this object
MyClass clonedMyClass = myClass.clone();
u0njafvf

u0njafvf17#

这是一个很好的解释 clone() 如果你最终需要它。。。
这里:克隆(java方法)

nbnkbykc

nbnkbykc18#

如下所示:

public class Deletable implements Cloneable{

    private String str;
    public Deletable(){
    }
    public void setStr(String str){
        this.str = str;
    }
    public void display(){
        System.out.println("The String is "+str);
    }
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

无论你想在哪里得到另一个对象,简单的执行克隆。例如:

Deletable del = new Deletable();
Deletable delTemp = (Deletable ) del.clone(); // this line will return you an independent
                                 // object, the changes made to this object will
                                 // not be reflected to other object
ctehm74n

ctehm74n19#

创建副本构造函数:

class DummyBean {
  private String dummy;

  public DummyBean(DummyBean another) {
    this.dummy = another.dummy; // you can access  
  }
}

每个对象都有一个克隆方法,可以用来复制对象,但不要使用它。创建类和执行不正确的克隆方法太容易了。如果你要这么做,至少读一下约书亚·布洛赫用有效的java语言对它所说的话。

gab6jxml

gab6jxml20#

我使用google的json库对其进行序列化,然后创建序列化对象的新示例。它做深度复制有一些限制:
不能有任何递归引用
它不会复制不同类型的数组
数组和列表应该被类型化,否则它将找不到要示例化的类
您可能需要在自己声明的类中封装字符串
我还使用这个类来保存用户的首选项、窗口等,以便在运行时重新加载。它是非常容易使用和有效的。

import com.google.gson.*;

public class SerialUtils {

//___________________________________________________________________________________

public static String serializeObject(Object o) {
    Gson gson = new Gson();
    String serializedObject = gson.toJson(o);
    return serializedObject;
}
//___________________________________________________________________________________

public static Object unserializeObject(String s, Object o){
    Gson gson = new Gson();
    Object object = gson.fromJson(s, o.getClass());
    return object;
}
       //___________________________________________________________________________________
public static Object cloneObject(Object o){
    String s = serializeObject(o);
    Object object = unserializeObject(s,o);
    return object;
}
}
6qftjkof

6qftjkof21#

添加 Cloneable 和下面的代码

public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

用这个 clonedObject = (YourClass) yourClassObject.clone();

b4wnujal

b4wnujal22#

使用 gson 用于复制对象。

public static <T>T copyObject(Object object){
    Gson gson = new Gson();
    JsonObject jsonObject = gson.toJsonTree(object).getAsJsonObject();
    return gson.fromJson(jsonObject,(Type) object.getClass());
}

假设我有个目标 person 所以呢

Person copyPerson = copyObject(person);

注意:性能要慢得多。

nwlls2ji

nwlls2ji23#

基本:java中的对象复制。
假设一个物体- obj1 ,它包含两个对象:containedobj1和containedobj2。

浅复制:
浅复制创建新的 instance 并将所有字段复制到新示例并返回它。对象类提供 clone 方法,并为浅层复制提供支持。

深度复制:
当对象与其引用的对象一起复制时,会发生深度复制。下图显示 obj1 在对其执行深度复制之后。不仅有 obj1 已复制,但其中包含的对象也已复制。我们可以用 Java Object Serialization 做深度复制。不幸的是,这种方法也有一些问题(详细的例子)。

可能的问题: clone 很难正确实施。
最好使用防御性复制、复制构造函数(如@egaga reply)或静态工厂方法。
如果你有一个对象,你知道它是公共的 clone() 方法,但您在编译时不知道对象的类型,那么您就有问题了。java有一个叫做 Cloneable . 实际上,如果我们想创建一个对象,就应该实现这个接口 Cloneable . Object.clone 是受保护的,所以我们必须用公共方法重写它才能访问它。
另一个问题出现在我们尝试深度复制复杂对象时。假设 clone() 所有成员对象变量的方法也做深度复制,这是一个太冒险的假设。必须控制所有类中的代码。
例如org.apache.commons.lang.serializationutils将具有使用序列化(source)进行深度克隆的方法。如果我们需要克隆bean,那么org.apache.commons.beanutils(源代码)中有几个实用方法。 cloneBean 将基于可用的属性getter和setter克隆bean,即使bean类本身没有实现cloneable。 copyProperties 对于所有属性名称相同的情况,将属性值从源bean复制到目标bean。

相关问题