2014-01-08 79 views
3

其實,我在網上搜索瞭解決方案。我還發現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); 

更新

目前,我解決了這個情況馬丁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 
+0

如何SerializationUtils.clone [http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/ apache/commons/lang/SerializationUtils.html] metod .. ?? – Siva

+0

你鏈接到問答的哪些部分不回答你的問題?不,沒有不復制一個字段並將其複製的不可思議的方法。另外請注意,您需要執行*深層複製*;您需要複製列表的*內容*而不僅僅是對列表的引用。(正如在上面的評論中指出的那樣,你可以使用序列化技術,但是你添加了大量的開銷並且可能是一個巨大的第三方依賴) –

+0

感謝你的建議 – CycDemo

回答

3

怎麼樣號Yoni ROIT的從第二#1建議的鏈接,您提供?換句話說,序列化,然後反序列化對象 - 所以這將導致深入複製你的對象字節明智。你需要讓你的類實現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(); 

在你的情況,你會想類型強制轉換爲特定的類課程。這樣你就不必顯式複製班級中的每個字段。

相關問題