如何使用更多功能样式的变量字段重写此Scala类?

时间:2015-06-02 23:55:13

标签: scala functional-programming

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调用期间存储计算值似乎很方便。

有哪些设计方案?

2 个答案:

答案 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