如何以更具功能性的风格用变量字段重写这个Scala类?
我希望避免在MyClass中保存状态,但在myMethod调用期间存储计算值似乎很方便如何以更具功能性的风格用变量字段重写这个Scala类?,scala,functional-programming,Scala,Functional Programming,我希望避免在MyClass中保存状态,但在myMethod调用期间存储计算值似乎很方便 有哪些设计方案可供选择?如果要缓存那些繁重计算的结果,则使用。第一次计算结果,如果参数相同,则返回结果: class MyClass { var myField = List.empty[Double] var mySecondField = List.empty[Double] def myMethod = { // code does some heavy computation
有哪些设计方案可供选择?如果要缓存那些繁重计算的结果,则使用。第一次计算结果,如果参数相同,则返回结果:
class MyClass {
var myField = List.empty[Double]
var mySecondField = List.empty[Double]
def myMethod = {
// code does some heavy computation
myField = myComputationOutput
mySecondField = mySecondComputationOutput
}
}
如果值从不改变,则可以考虑只使用引用的第一次计算它们,使用惰性评估:
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)
}
}
}
另一种方法是考虑<代码> MyClass <代码>实际上是两个类,对应于两个阶段,即计算之前和之后。然后,易变性是一种全局状态,而不是两个变量状态的混合。
在myMethod中,您可以返回MyClass的新实例,而不是返回Unit
使用case类的代码:
class MyClass {
lazy val myField = myComputationOutput
lazy val mySecondField = mySecondComputationOutput
}
case class MyClass(myField:List[Double]=List.empty[Double]) {
def myMethod = copy(myField = myComputationOutput)
}