scala - 使用现有实例中的值干净地创建类型的新实例
问题描述
我正在尝试学习 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
它们放入同一个对象中。但是,如果我要以“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
使用已经存在的值的新实例并同时设置新计算的值而不会使代码变得冗长?还是我处理问题的方式需要重新思考?
解决方案
您可以将其设为 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 = ...)
推荐阅读
- mysql - 当结果很少时 MySQL-select 查询很慢
- sql-server - 使用远程服务器上的 SAS 使用 Microsoft NT 身份验证将 SAS 连接到 SQL Server 数据库 ODBC
- python - 构建电子商务网站时在 Python/Django 中的DoesNotExists 查询
- ios - 视图加载时滚动到滚动视图中的选定位置 - SwiftUI
- flutter - Flutter 命名构造函数和私有构造函数
- r - 使用 tidyverse 在 tibble 中“取消嵌套” data.frame 列
- python - 具有递归函数的列表元素的Python总和
- spring-boot - 使用 Java 流在单个对象中组合/连接 2 个属性/字段(名字 + 姓氏)
- prolog - 我为我的家谱写了一个序言代码。这段代码有什么问题?
- kubernetes - 如何使用 Kustomize 并创建一个环境,例如:“http://${namePrefix}service-a/some-path”或“jdbc:db2://${namePrefix}service-b:${dbPort}/${数据库名称}"