实际上,我在网上搜索了解决方案。我还找到了Copy an object in Java。在我的对象中,有很多映射。
即使我使用Cloneable
和Copy Constructor
,我仍需要复制每个字段吗?
我的要求是了解Old Object
和New Object
之间哪些数据发生了变化。
我的对象示例树:
MotorProposal
- startDate : Date ---> can change
- endDate : Date ---> can change
- customer : Cutomer
- vehicleList : List<Vehicle> ---> can chnage
- carNo : String ---> can change
- loading : int ---> can change
- cubicCapacity : int ---> can chnage
- driver : Driver ---> can change
- fullName : String ---> can change
- address : Stirng ---> can change
- license : Stirng ---> can change
- expYear : int ---> can change
- model : Model
-there other fields
-there other fields
是否有其他方法可以创建具有相同值的新实例而无需复制每个字段?
我的预期计划
MotorProposal oldProposal = --> come from DB
MotorProposal newProposal = org.someapi.ObjectUtil.newInstance(oldProposal);
更新
目前,我解决了马丁·迪诺夫建议的这个案例。如下所示。
ObjCopy.java
public class ObjCopy {
public static Serializable newInstance(Serializable obj) {
Serializable result = null;
try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(buffer);
oos.writeObject(obj);
oos.flush();
oos.close();
ByteArrayInputStream in = new ByteArrayInputStream(buffer.toByteArray());
ObjectInputStream ois = new ObjectInputStream(in);
return (Serializable)ois.readObject();
} catch (Exception e) {
//do nothing
e.printStackTrace();
}
return result;
}
}
Test.java
public class Test {
public static void main(String[] args) {
Country country = new Country();
country.setName("Myanmar");
Province province_1 = new Province();
province_1.setCountry(country);
province_1.setName("Yangon");
Province province_2 = (Province)ObjCopy.newInstance(province_1);
province_2.getCountry().setName("USA");
System.out.println(province_1.getName() + "-" + province_1.getCountry().getName());
System.out.println(province_2.getName() + "-" + province_2.getCountry().getName());
}
}
输出
Yangon-Myanmar
Yangon-USA
答案 0 :(得分:3)
Yoni Roit从您提供的Stackoverflow链接的第二个提案怎么样?换句话说,序列化然后反序列化对象 - 这将导致按字节深度复制对象。你需要让你的类实现Serializable。只要所有类字段都可以序列化,这种方法应该可行。但是,序列化和反序列化对象显然可能非常缓慢 - 如果您想要方便而不是效率,这可能不是问题。这是一个重新创建新ArrayList的简单示例:
ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(5);
foo.add(3);
foo.add(1);
ArrayList<Integer> obj = null;
// Write the object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(foo);
out.flush();
out.close();
// Make an input stream from the byte array and read
// a copy of the object back in.
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
bos.toByteArray()));
obj = (ArrayList<Integer>)in.readObject();
在你的情况下,你当然希望输入你的特定课程。这样您就不必显式复制类中的每个字段。
答案 1 :(得分:0)