使用现有实例中的值干净地创建类型的新实例

时间:2019-03-10 13:09:38

标签: scala functional-programming

我正在尝试学习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是要计算,并根据tr1open, high, low计算close,并根据从其他tr14实例中检索的一系列tr1值计算TDay

如果我用Java编写代码,我会很高兴地计算tr1tr14的值,并将它们放入 same 对象中。但是,如果我要执行这种“ 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的新实例,并在不使代码变得冗长的情况下同时设置新计算的值?还是我解决问题的方式需要重新考虑?

1 个答案:

答案 0 :(得分:2)

您可以将其设置为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 = ...)