gpt4 book ai didi

java - 如何创建具有相同值的新实例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:49:42 25 4
gpt4 key购买 nike

实际上,我在网上搜索了解决方案。我还找到了Copy an object in Java .在我的对象中,有很多映射。即使我使用了 CloneableCopy Constructor,我仍然需要为每个字段复制?

我的要求是知道哪些数据在 Old ObjectNew 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);

更新

目前,我正在解决 Martin Dinov 建议的这个案例。如下图。

对象拷贝.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;
}
}

测试.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

最佳答案

来自您提供的 Stackoverflow 链接的 Yoni Roit 的第二个提案怎么样?换句话说,序列化然后反序列化对象 - 因此这将导致按字节深度复制对象。您需要让您的类实现可序列化。只要所有类字段都可以序列化,这种方法就应该有效。但是,序列化和反序列化对象显然可能非常慢 - 如果您出于方便而不是出于效率考虑这样做可能不是问题。这是重新创建新 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();

在您的情况下,您当然希望将类型转换为您的特定类(class)。这样您就不必显式复制类中的每个字段。

关于java - 如何创建具有相同值的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20989940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com