【问题标题】:How to override parameter on Scala class constructor如何覆盖Scala类构造函数中的参数
【发布时间】:2015-05-15 05:37:43
【问题描述】:

是否可以在 Scala 构造函数上覆盖“val”类型?

给定一个这样的类:

class GPPerson (id: Option[GPID], created: Option[DateTime], active: Boolean, primaryEmail: String)

我想创建一个基本上可以做到这一点的构造函数:

if (created == None) created = new DateTime

换句话说,如果提供了 None 值,请将其替换为 DateTime 实例。问题是,我试图避免使用伴随对象,并且“创建”对象需要是“val”(不能使其成为“var”)。

【问题讨论】:

  • 为什么要避免使用伴随对象?这有点……你是怎么做的。
  • 伴生对象会使事情复杂化。这并非不可能,但就像我说的“尽量避免”。这些是 Slick 中的 TableQuery 类,并且引入伴随对象会导致隐式对话中断......(例如, tupled() 方法由于 apply() 方法而“丢失”)。这可以通过实现一个显式的 tupled() 来解决,但是......这基本上是我们所有模型的模板,所以我试图让它尽可能简单。

标签: scala


【解决方案1】:

构造函数参数可能有默认值:

class GPPerson (id: Option[GPID], created: Option[DateTime] = Some(new DateTime), active: Boolean, primaryEmail: String)
// to instantiate it:
new GPPerson(id = Some(id), active = false, primaryEmail = myEmail)

您可能想要重新排序参数,以便可选参数是最后一个,然后您可以省略参数名称:

class GPPerson (id: Option[GPID], active: Boolean, primaryEmail: String, created: Option[DateTime] = Some(new DateTime))
// to instantiate it:
new GPPerson(Some(id), false, myEmail)

【讨论】:

  • 谢谢 Jhonny,很好的建议(我试图避免更改顺序,因为我们的模型对象的“标准”是使 id 和 created date 前两个参数一致 - 是的,它进一步复杂化了东西)。
【解决方案2】:

一种方法是

class GPPerson (id: Option[GPID], _created: Option[DateTime], active: Boolean, primaryEmail: String) {
  val created = _created.getOrElse(new DateTime)
}

另一个:

class GPPerson (id: Option[GPID], created: DateTime, active: Boolean, primaryEmail: String) {
  def this(id: Option[GPID], _created: Option[DateTime], active: Boolean, primaryEmail: String) = this(id, _created.getOrElse(new DateTime), active, primaryEmail)
}

虽然对于这种特定情况,我会选择@JhonnyEverson 的解决方案。

【讨论】:

  • 好建议 - 感谢您跳出框框思考!不幸的是,这行不通,因为它是一个模型对象,然后会尝试持久化 _created...(由于 Slick 的工作方式,试图完全获得我们想要的东西是不可能的,这似乎是需要在“优雅”的 API 与“简单”的设计模式之间做出妥协)。
  • 在第二个选项中,_created 不是一个字段,它应该可以工作。另一方面,为所有模型对象重复这样的辅助构造函数会非常糟糕。我猜可以通过宏注释来避免,但是当默认参数也可以工作时,这是一个过于重量级的解决方案:)
  • 我同意...虽然很诱人。而且,您可以将主构造函数参数标记为私有,以隐藏非可选版本(“class GPPerson private (id: ...”但是......就像你说的,有点恶心。不过,它确实实现了目标...
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2018-03-15
  • 2017-11-10
  • 2017-02-03
  • 2013-03-16
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多