Java 如何创建具有相同值的新实例?
事实上,我在网上搜索了解决方案。我也发现了。在我的对象中,有很多映射。 即使我使用Java 如何创建具有相同值的新实例?,java,Java,事实上,我在网上搜索了解决方案。我也发现了。在我的对象中,有很多映射。 即使我使用Cloneable和Copy Constructor,我仍然需要为每个字段复制 我的要求是知道在旧对象和新对象之间更改了哪些数据 我的对象示例树: MotorProposal - startDate : Date ---> can change - endDate : Date ---> can change - custo
Cloneable
和Copy Constructor
,我仍然需要为每个字段复制
我的要求是知道在旧对象
和新对象
之间更改了哪些数据
我的对象示例树:
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
更新
目前,我解决了Martin Dinov建议的这个案例。如下
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
Yoni Roit从您提供的Stackoverflow链接中提出的第二个建议如何?换句话说,序列化然后反序列化对象-因此这将导致按字节深度复制对象。您需要让类实现可序列化。只要所有类字段都可以序列化,这种方法就应该有效。然而,序列化和反序列化对象显然会非常慢——如果出于方便而不是效率考虑,那么这可能不是问题。下面是一个重新创建新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();
ArrayList foo=new ArrayList();
foo.add(5);
foo.add(3);
foo.add(1);
ArrayList obj=null;
//将对象写入字节数组
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
ObjectOutputStream out=新的ObjectOutputStream(bos);
out.writeObject(foo);
out.flush();
out.close();
//从字节数组生成输入流并读取
//将对象的副本放回。
ObjectInputStream in=新建ObjectInputStream(新建ByteArrayInputStream(
toByteArray());
.readObject()中的obj=(ArrayList);
在您的情况下,您当然希望键入特定类的cast。通过这种方式,您不必显式复制类中的每个字段。没有CyCDemo,关于可克隆接口以及Java没有实现深度复制的原因和原因有很多问题 无论如何,请注意:
SerializationUtils.clone如何[metod..?您链接到的Q的答案中有哪部分没有回答您的问题?不,没有神奇的方法不复制字段并将其复制。另外,请注意,您需要进行深度复制;您需要复制列表的内容,而不仅仅是对列表的引用。(如上面的评论所述,您可以使用序列化技术,但这会增加很多开销,并且可能会产生巨大的第三方依赖性)谢谢你的帮助suggestion@CycDemo如果您的目的只是想知道模型对象的哪些数据被修改了,为什么不使用PropertyChangeListeners而不是deep copy的所有麻烦呢?请参考示例。
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();