2013-09-24 44 views
1

當我需要兩個獨立變量時,複製類的最佳方式是什麼? 我有簡單的類:複製對象字段

public class MyClass 
{ 
boolean a = false; 
String b= "not empty"; 
} 

,我需要做一些方法,如:

assign(MyClass data) 
{ 
a= data.a; 
b= data.b; 
} 

有沒有自動的方法複製(複製)的Java對象?

+0

複製構造函數或方法可能會派上用場。 –

+0

您需要的是深層複製。我想你可以通過複製構造函數來完成。 – codeMan

回答

3

做我需要做一些方法,如:

八九不離十。而不是使它成爲方法,你應該使它成爲一個構造函數。這樣的構造函數的調用copy constructor,與您共創他們是這樣的:

MyClass(MyClass data) { 
    a = data.a; 
    b = data.b; 
} 

然後創建實例的副本,請使用構造函數是這樣的:

MyClass obj1 = new MyClass(); 
MyClass obj2 = new MyClass(obj1); 

拷貝構造函數可單調乏味的

當你的類有可變字段時,使用拷貝構造函數來創建深拷貝可能是單調乏味的。在這種情況下,這些賦值只會創建引用的副本,而不會創建對象本身。您還必須創建這些字段的副本(如果您想要深層複製)。這可以遞歸。

一個更好的方式來創建深拷貝是序列化然後反序列化你的對象。

爲什麼不使用clone()?

在對象類中增加clone()方法是一個很大的錯誤,IMO。你應該避免使用它來克隆對象。

  • 爲一體,使用該方法,你必須實現Cloneable接口,措手不及實際上不具有clone()方法。事實上,它只是一個標記界面。
  • 返回類型Object#clone()方法是Object。所以,這意味着您實際上可以返回完全無關的類的實例,從而在運行時將您的代碼引導至潛在的ClassCastException

參見:

+0

哇這真的很棒..一直在java中編程一段時間,從來沒有見過! –

+0

@KubaSpatny它是所有'java.util'集合類中的標準。 – arshajii

+0

@arshajii永遠不會停止學習:)感謝您指出這一點,我必須更深入地研究這一點。我一直在使用深拷貝方法。 –

1

您可以使用複製construc手工做深克隆tor或u可以使用可用於此目的的實用程序,例如:https://code.google.com/p/cloning/

如果ur類具有許多非原始成員變量,那麼deepcloning的複雜性會增加,所以我建議您使用該實用程序。

0

這些都是2點的方法,首先使用Cloneable接口(這不是優選的),以及另一種是創建類中的方法,它返回一個新的實例與當前狀態

public class MyObject implements Cloneable { 

    private int num = 0; 

    // a method to show how to clone an object 
    private void copyObject() throws CloneNotSupportedException { 

     MyObject a = new MyObject(); 
     a.num = 10; 

     MyObject b = (MyObject)a.clone(); 
     System.out.println(b.num); 
     // result : 10 
     // values are copied to the new object 

     b.num = 20; 
     System.out.println(a.num + " - " + b.num); 
     // result : 10 - 20 
     // 2 different objects, the new object didnt effect the original one 
    } 

    // a method to create a copy 
    public MyObject copy() { 
     MyObject copy = new MyObject(); 
     copy.num = this.num; 
     // do the same to all your variables 
     return copy; 
    } 

    // a method to show how to use the copy() method 
    private void useCopy(){ 

     MyObject a = new MyObject(); 
     a.num = 100; 

     MyObject b = a.copy(); 

     System.out.println(a.num+" - "+b.num); 
     // result : 100 - 100 
     // value copied to the new Object 

     a.num = 10; 
     b.num = 20; 
     System.out.println(a.num + " - " + b.num); 
     // result : 10 - 20 
     // although b was copied from a, but both are 2 different Objects 
    } 
} 

也有另一種使用反射包複製值的方法,但畢竟,你確定你在設計的正確軌道上?

如果你能告訴我們你在想什麼,也許設計模式可能有所幫助