Scala对象克隆(复制),无需重新评估值

Scala对象克隆(复制),无需重新评估值,scala,copy,clone,Scala,Copy,Clone,我有一个大目标: case class BigObject(val str: String, val number: Int) { val someVal = ... val someVal2 = ... } 我想复制这件物品,不需要重新估价。可能吗?现在我正在使用这种方法: val newBigObject = oldBigObject.copy(str = newStr) 正如我从日志/调试器中看到的,“someVal”和“someVal2”被重新评估。有可能避免吗?因为我的Bi

我有一个大目标:

case class BigObject(val str: String, val number: Int) {
val someVal = ...
val someVal2 = ...
    }
我想复制这件物品,不需要重新估价。可能吗?现在我正在使用这种方法:

val newBigObject = oldBigObject.copy(str = newStr)
正如我从日志/调试器中看到的,“someVal”和“someVal2”被重新评估。有可能避免吗?因为我的BigObject非常大,重新评估价值需要一些时间,但性能对我来说非常重要

谢谢你的回答

这里有一个方法:

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

}
现在,无需重新计算内部字段即可进行复制:

val bigObj = BigObject("hello", 42)
val anotherBigObj = bigObj.copy(newStr = "anotherStr")
或者,如果您不喜欢伴生对象,可以创建两个构造函数。主字段包括所有字段(也包括不可见的字段),并且将是私有的。public-one只有两个可见参数:

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

谢谢!你真的帮了我的忙。@britva很高兴能为我服务