2011-11-10 46 views
13

有沒有一種方法,使一個對象的副本(甚至更好對象的列表)? 我正在討論可能被其他類擴展的類的自定義對象。階副本對象

例如:

class Foo() { 
    var test = "test" 
} 

class Bar() extends Foo { 
    var dummy = new CustomClass() 
} 

var b = new Bar() 
var bCopy = b.copy() // or something? 
+6

注意,你並不需要,如果你把你的對象不可改變進行復印。 –

回答

21

在Java中,他們試圖解決這個問題clone方法,通過在所有超類調用clone工作,但是這通常被認爲是破碎的和最好避免,原因你可以查找(例如here)。

於是在Scala中,以Java作爲genereally,你將不得不作出自己的複製方法對任意類,它將允許你喜歡深VS領域的淺拷貝指定的東西。

如果你讓你上課case class,你會得到一個免費的copy方法。它實際上比這更好的,因爲你可以在同一時間更新任何字段:

case class A(n: Int) 
val a = A(1)   // a: A = A(1) 
val b = a.copy(a.n) // b: A = A(1) 
val c = a.copy(2) // c: A = A(2) 

從case類繼承但是不推薦使用。

+0

是不是有什麼東西:Collections.copy(list1,list2)在Java中,但然後爲斯卡拉? – user485659

+1

@ user485659如果您要具體詢問關於集合的信息,可以查看文檔,並看到有很多這種方法。例如,'ArrayBuffer'有一個'clone'方法。但通常你會使用不可變的'List',就像Daniel Sobral指出的那樣,沒有理由複製。 –

+0

@LuigiPlinge案例類的副本如何工作?它只是通過引用複製變量,或者做別的事情? –