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") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |