其實,我在網上搜索瞭解決方案。我還發現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);
更新
目前,我解決了這個情況馬丁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
如何SerializationUtils.clone [http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/ apache/commons/lang/SerializationUtils.html] metod .. ?? – Siva
你鏈接到問答的哪些部分不回答你的問題?不,沒有不復制一個字段並將其複製的不可思議的方法。另外請注意,您需要執行*深層複製*;您需要複製列表的*內容*而不僅僅是對列表的引用。(正如在上面的評論中指出的那樣,你可以使用序列化技術,但是你添加了大量的開銷並且可能是一個巨大的第三方依賴) –
感謝你的建議 – CycDemo