案例类构造函数的预处理参数,不重复参数列表

时间:2014-09-16 11:42:58

标签: scala

我有这个案例类有很多参数:

case class Document(id:String, title:String, ...12 more params.. , keywords: Seq[String]) 

对于某些参数,我需要在创建对象之前进行一些字符串清理(修剪等)。

我知道我可以使用apply函数添加一个伴随对象,但我想要的最后一件事是在我的代码中编写参数列表TWICE(case类构造函数和伴随对象的应用)。

Scala能否为我提供帮助?

2 个答案:

答案 0 :(得分:3)

我的一般建议是:

  • 您的目标(数据预处理)是伴随对象的完美用例 - 所以尽管有样板文件,它可能是最惯用的解决方案。

  • 如果案例类参数的数量很高,那么构建器模式肯定有帮助,因为您不必记住参数的顺序,IDE可以帮助您调用构建器成员职能。使用case类构造函数的命名参数允许你使用随机参数顺序,但据我所知,没有IDE自动完成命名参数=>使构建器类稍微方便一些。但是,使用构建器类会引发如何处理强制执行某些参数规范的问题 - 简单的解决方案可能会导致运行时错误; type-safe solution有点冗长。在这方面,具有默认参数的案例类更优雅。

还有这个解决方案:使用默认参数preprocessed引入另一个标记false。无论何时您想使用实例val d: Document,都可以通过案例类复制方法调用d.preprocess()(以避免再次输入所有参数):

case class Document(id: String, title: String, keywords: Seq[String], preprocessed: Boolean = false) {
  def preprocess() = if (preprocessed) this else {
    this.copy(title = title.trim, preprocessed = true) // or whatever you want to do
  }
}

但是:您无法阻止客户端将preprocessed初始化为true

另一种选择是将一些参数设为private val,并为预处理数据公开相应的getter:

case class Document(id: String, title: String, private val _keywords: Seq[String]) {
  val keywords = _keywords.map(kw => kw.trim)
}

但是:模式匹配和默认的toString实现不会给你你想要的东西......

答案 1 :(得分:1)

在改变了半小时的背景后,我用新鲜的眼睛看着这个问题并提出了这个问题:

case class Document(id: String, title: String, var keywords: Seq[String]) {
  keywords = keywords.map(kw => kw.trim)
}

我只是将参数变为可变,在类体中添加var和清理数据。

好的我知道,我的数据不再是一成不变的了,而且看到这个之后马丁奥德斯基可能会杀死一只小猫,但是嘿..我设法做了我想添加的 3个字符。我称之为胜利:)