首页 > 解决方案 > 使用现有实例中的值干净地创建类型的新实例

问题描述

我正在尝试学习 Scala,并尝试在创建对象时遵守不可变原则。

我有一个 Scala 类定义为:

class TDay(date: LocalDate, open: Double, high: Double,
           low: Double, close: Double, tr1: Double = 0.0, tr14: Double = 0.0)
{

}

参数date, open, high, lowclose是我在创建任何TDay实例时知道的所有值,但是tr1tr14是要计算的值,tr1并且是open, high, low根据从其他实例中检索到的一系列值计算得出的。closetr14tr1TDay

如果我在 Java 中对此进行编码,我会很乐意计算 的值tr1并将tr14它们放入同一个对象中。但是,如果我要以“Scala 方式”执行此操作,我假设TDay每次我想计算tr1tr14为给定实例创建新TDay实例。

我可以重载TDay构造函数:

def this(tDay: TDay, tr1: Double)
    {
        this(tDay.date, tDay.open, tDay.high, tDay.low, tDay.close,
        tr1, tDay.tr14)
    }

但这意味着我已经定义了一个签名构造函数,(TDay, Double)因此不能再次重载来设置tr14. 事实上,我这里的例子已经简化了,我还有几个Double值需要计算并设置每个需要按特定顺序完成的值。

有没有一种干净的方法来创建一个TDay使用已经存在的值的新实例并同时设置新计算的值而不会使代码变得冗长?还是我处理问题的方式需要重新思考?

标签: scalafunctional-programming

解决方案


您可以将其设为 a case class,这将是表示如下简单记录的常用方法:

case class TDay(date: LocalDate, open: Double, high: Double,
                low: Double, close: Double, tr1: Double = 0.0, tr14: Double = 0.0)

然后您可以使用该copy方法创建具有更新元素的副本:

val td: TDay = ...
val tdNew = td.copy(tr1 = ..., tr14 = ...)

推荐阅读