我正在尝试学习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, low
和close
是我在创建任何TDay
实例时都知道的值,但是tr1
和tr14
是要计算,并根据tr1
和open, high, low
计算close
,并根据从其他tr14
实例中检索的一系列tr1
值计算TDay
如果我用Java编写代码,我会很高兴地计算tr1
和tr14
的值,并将它们放入 same 对象中。但是,如果我要执行这种“ Scala方式”,我想每次为给定的TDay
计算tr1
或tr14
时,都需要创建新的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
的新实例,并在不使代码变得冗长的情况下同时设置新计算的值?还是我解决问题的方式需要重新考虑?
答案 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 = ...)