class MyClass {
var myField = List.empty[Double]
var mySecondField = List.empty[Double]
def myMethod = {
// code does some heavy computation
myField = myComputationOutput
mySecondField = mySecondComputationOutput
}
}
我想避免在MyClass中保存状态,但在myMethod调用期间存储计算值似乎很方便。
有哪些设计方案?
答案 0 :(得分:2)
如果要缓存那些繁重计算的结果,那么使用memoize pattern。您第一次计算结果,如果参数相同则返回结果:
class MyClass {
var myField = Option[List[Double]] = None
var mySecondField = Option[List[Double]] = None
def myMethod = {
if ( ! myField.isDefined ) {
myField = Some(myComputationOutput)
}
if ( ! mySecondField.isDefined ) {
mySecondField = Some(mySecondComputationOutput)
}
}
}
如果值永远不会改变,您可以考虑使用延迟评估,仅在第一次引用它们时计算它们:
class MyClass {
lazy val myField = myComputationOutput
lazy val mySecondField = mySecondComputationOutput
}
另一种方法是考虑MyClass
实际上是两个类,对应于两个阶段,即在计算完成之前和之后。然后,可变性是一个全局状态,而不是两个变量状态的混合。
答案 1 :(得分:1)
您可以返回myClass的新实例,而不是在myMethod中返回case class MyClass(myField:List[Double]=List.empty[Double]) {
def myMethod = copy(myField = myComputationOutput)
}
。
使用案例类的代码:
PK