當我需要兩個獨立變量時,複製類的最佳方式是什麼? 我有簡單的類:複製對象字段
public class MyClass
{
boolean a = false;
String b= "not empty";
}
,我需要做一些方法,如:
assign(MyClass data)
{
a= data.a;
b= data.b;
}
有沒有自動的方法複製(複製)的Java對象?
當我需要兩個獨立變量時,複製類的最佳方式是什麼? 我有簡單的類:複製對象字段
public class MyClass
{
boolean a = false;
String b= "not empty";
}
,我需要做一些方法,如:
assign(MyClass data)
{
a= data.a;
b= data.b;
}
有沒有自動的方法複製(複製)的Java對象?
做我需要做一些方法,如:
八九不離十。而不是使它成爲方法,你應該使它成爲一個構造函數。這樣的構造函數的調用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
。參見:
哇這真的很棒..一直在java中編程一段時間,從來沒有見過! –
@KubaSpatny它是所有'java.util'集合類中的標準。 – arshajii
@arshajii永遠不會停止學習:)感謝您指出這一點,我必須更深入地研究這一點。我一直在使用深拷貝方法。 –
您可以使用複製construc手工做深克隆tor或u可以使用可用於此目的的實用程序,例如:https://code.google.com/p/cloning/
如果ur類具有許多非原始成員變量,那麼deepcloning的複雜性會增加,所以我建議您使用該實用程序。
這些都是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
}
}
也有另一種使用反射包複製值的方法,但畢竟,你確定你在設計的正確軌道上?
如果你能告訴我們你在想什麼,也許設計模式可能有所幫助
複製構造函數或方法可能會派上用場。 –
您需要的是深層複製。我想你可以通過複製構造函數來完成。 – codeMan