加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:04:08 所属栏目:安全 来源:网络整理
导读:我有一个大对象: case class BigObject(val str: String,val number: Int) {val someVal = ...val someVal2 = ... } 我想复制这个对象而不重新评估值.可能吗?现在我正在使用这种方法: val newBigObject = oldBigObject.copy(str = newStr) 正如我从日志/
我有一个大对象:

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,someVal2)
  }

}

现在,您无需重新评估内部字段即可进行复制:

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

或者,如果您不喜欢伴侣对象,则可以创建两个构造函数.主要的一个包括所有字段(也是不可见的字段)并且是私有的.公众将只有两个可见参数:

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

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

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

}

用法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读