当我需要有两个自变量时,复制类的最佳方法是什么?我有简单的课程:
public class MyClass
{
boolean a = false;
String b= "not empty";
}
我需要做一些方法吗:
assign(MyClass data )
{
a= data.a;
b= data.b;
}
是否有任何自动方法可以在 java 中复制(复制)对象?
当我需要有两个自变量时,复制类的最佳方法是什么?我有简单的课程:
public class MyClass
{
boolean a = false;
String b= "not empty";
}
我需要做一些方法吗:
assign(MyClass data )
{
a= data.a;
b= data.b;
}
是否有任何自动方法可以在 java 中复制(复制)对象?
我需要做一些方法吗:
很接近了。与其将其设为方法,不如将其设为构造函数。这样的构造函数称为复制构造函数,您可以像这样创建它们:
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
在运行时具有潜力。也可以看看:
您可以使用复制构造函数手动进行深度克隆,也可以使用可用于该目的的实用程序,例如:https ://code.google.com/p/cloning/
如果您的类有许多非原始成员变量,则深度克隆的复杂性会增加,我建议您使用该实用程序。
这是 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
}
}
还有另一种使用反射包复制值的方法,但毕竟,你确定你在设计方面是正确的吗?
如果你能告诉我们你在想什么,也许设计模式可能会有所帮助