2013-03-22 61 views
4

我有大對象:斯卡拉對象克隆(複製)沒有價值的重新估值

case class BigObject(val str: String, val number: Int) { 
val someVal = ... 
val someVal2 = ... 
    } 

我想沒有價值的重新估值複製此對象。可能嗎?現在,我使用這種方法:

val newBigObject = oldBigObject.copy(str = newStr) 

當我從日誌/調試器看到,「someVal」和「someVal2」重新計價。是否有可能避免它?由於我的BigObject真的很大,價值重估需要一些時間,但是性能對我來說非常重要。

感謝您的回答!

回答

6

這裏有一個辦法:

充分利用someValsomeVal2領域這也傳遞給構造並拉出初始化邏輯在同伴對象的字段。

你的情況:

class BigObject private(val str: String, 
         val number: Int, 
         val someVal: SomeType, 
         val someVal2: SomeType) { 

    def copy(newStr: String = str, newNumber: Int = number) = { 
    new BigObject(newStr, newNumber, someVal, someVal2) 
    } 
} 

object BigObject { 

    def apply(str: String, number: Int): BigObject = { 
    val someVal = initialize() //your initialization logic here 
    val someVal2 = initialize2() 
    new BigObject(str, number, someVal, someVal2) 
    } 

} 

現在,你可以在不重新evaling內場複製:

val bigObj = BigObject("hello", 42) 
val anotherBigObj = bigObj.copy(newStr = "anotherStr") 

另外,如果你不喜歡伴侶的對象,你可以做兩個構造函數。主要包括所有的領域(也是不可見的領域),將是私人的。公衆一個將只有兩個可見的參數:

class BigObject private(val str: String, 
         val number: Int, 
         val someVal: Any, 
         val someVal2: Any) { 

    def this(str: String, number: Int) = this(str, number, initializeVal, initializeVal2) 

    def copy(newStr: String = str, newNumber: Int = number) = { 
    new BigObject(newStr, newNumber, someVal, someVal2) 
    } 

} 

用法:

val bigObj = new BigObject("hello", 42) 
val anotherBigObj = bigObj.copy(newStr = "anotherStr") 
+0

非常感謝!你真的幫助了我。 – psisoyev 2013-03-22 10:58:41

+0

@britva很高興爲您服務 – 2013-03-22 11:05:06