如何以更具功能性的风格用变量字段重写这个Scala类?

如何以更具功能性的风格用变量字段重写这个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

我希望避免在MyClass中保存状态,但在myMethod调用期间存储计算值似乎很方便


有哪些设计方案可供选择?

如果要缓存那些繁重计算的结果,则使用。第一次计算结果,如果参数相同,则返回结果:

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