這裏有一個辦法:
充分利用someVal
和someVal2
領域這也傳遞給構造並拉出初始化邏輯在同伴對象的字段。
你的情況:
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")
非常感謝!你真的幫助了我。 – psisoyev 2013-03-22 10:58:41
@britva很高興爲您服務 – 2013-03-22 11:05:06