我有这个案例类有很多参数:
case class Document(id:String, title:String, ...12 more params.. , keywords: Seq[String])
对于某些参数,我需要在创建对象之前进行一些字符串清理(修剪等)。
我知道我可以使用apply函数添加一个伴随对象,但我想要的最后一件事是在我的代码中编写参数列表TWICE(case类构造函数和伴随对象的应用)。
Scala能否为我提供帮助?
答案 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个字符。我称之为胜利:)