1

当我需要有两个自变量时,复制类的最佳方法是什么?我有简单的课程:

public class MyClass 
{
boolean a = false;
String b= "not empty";
}

我需要做一些方法吗:

assign(MyClass data )
{
a= data.a;
b= data.b;
}

是否有任何自动方法可以在 java 中复制(复制)对象?

4

3 回答 3

3

我需要做一些方法吗:

很接近了。与其将其设为方法,不如将其设为构造函数。这样的构造函数称为复制构造函数,您可以像这样创建它们:

MyClass(MyClass data) {  
    a = data.a;
    b = data.b;
}

然后要创建实例的副本,您可以使用如下构造函数:

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass(obj1);

复制构造函数可能很乏味

当您的类具有可变字段时,使用复制构造函数创建深度复制可能会很乏味。在这种情况下,像这样的赋值只会创建引用的副本,而不是对象本身。您还必须创建这些字段的副本(如果您想要深层副本)。这可以递归。

创建深层副本的更好方法是序列化然后反序列化您的对象。

为什么不使用克隆()?

在 Object 类中添加clone()方法是一个很大的错误,IMO。您应该避免使用它来克隆对象。

  • 一方面,要使用该方法,您必须实现Cloneable接口,令人惊讶的是实际上并没有该clone()方法。实际上,它只是一个标记界面。
  • 方法的返回类型Object#clone()Object. 因此,这意味着您实际上可以返回一个完全不相关的类的实例,从而使您的代码ClassCastException在运行时具有潜力。

也可以看看:

于 2013-09-24T18:20:08.037 回答
1

您可以使用复制构造函数手动进行深度克隆,也可以使用可用于该目的的实用程序,例如:https ://code.google.com/p/cloning/

如果您的类有许多非原始成员变量,则深度克隆的复杂性会增加,我建议您使用该实用程序。

于 2013-09-24T18:21:47.567 回答
0

这是 2 种方法,第一种是使用 Cloneable 接口(这不是首选),另一种是在您的类中创建一个方法,该方法返回一个具有当前状态的新实例

public class MyObject implements Cloneable {

    private int num = 0;

    // a method to show how to clone an object
    private void copyObject() throws CloneNotSupportedException {

        MyObject a = new MyObject();
        a.num = 10;

        MyObject b = (MyObject)a.clone();
        System.out.println(b.num);
        // result : 10
        // values are copied to the new object

        b.num = 20;
        System.out.println(a.num + " - " + b.num);
        // result : 10 - 20
        // 2 different objects, the new object didnt effect the original one
    }

    // a method to create a copy
    public MyObject copy() {
        MyObject copy = new MyObject();
        copy.num = this.num;
        // do the same to all your variables
        return copy;
    }

    // a method to show how to use the copy() method
    private void useCopy(){

        MyObject a = new MyObject();
        a.num = 100;

        MyObject b = a.copy();

        System.out.println(a.num+" - "+b.num); 
        //  result : 100 - 100
        //  value copied to the new Object

        a.num = 10;
        b.num = 20;
        System.out.println(a.num + " - " + b.num);
        //  result : 10 - 20
        //  although b was copied from a, but both are 2 different Objects
    }
}

还有另一种使用反射包复制值的方法,但毕竟,你确定你在设计方面是正确的吗?

如果你能告诉我们你在想什么,也许设计模式可能会有所帮助

于 2013-09-24T19:02:45.483 回答