gpt4 book ai didi

Scala 对象克隆(复制)而不进行值重估

转载 作者:行者123 更新时间:2023-12-02 04:04:01 27 4
gpt4 key购买 nike

我有一个大对象:

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

我想复制此对象而不重新评估值。是否可以?现在我正在使用这种方法:

val newBigObject = oldBigObject.copy(str = newStr)

正如我从日志/调试器中看到的,“someVal”和“someVal2”被重新评估。有可能避免吗?由于我的 BigObject 非常大,值(value)重新评估需要一些时间,但性能对我来说非常重要。

感谢您的回答!

最佳答案

这里有一个方法:

创建 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)
}

}

现在,您可以复制而无需重新评估内部字段:

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

或者,如果您不喜欢伴生对象,则可以创建两个构造函数。第一个包含所有字段(也包括不可见的字段)并且将是私有(private)的。公共(public)参数只有两个可见参数:

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")

关于Scala 对象克隆(复制)而不进行值重估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15568016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com