我想要一个具有许多字段(例如字符串、布尔值等)的类,并且在构造该类时,我想要一个与每个字段关联的字段名并验证该字段(使用字符串的正则表达式)。理想情况下,我只想在构造函数中指定参数需要满足某些条件。
一些示例代码:
case class Data(val name: String ..., val fileName: String ...) {
name.verify
// Access fieldName associated with the name parameter.
println(name.fieldName) // "Name"
println(fileName.fieldName) // "File Name"
}
val x = Data("testName", "testFile")
// Treat name as if it was just a string field in Data
x.name // Is of type string, does not expose fieldName, etc
有没有一种优雅的方法来实现这一目标?
编辑:
我认为我还没有能够清楚地表达出我所追求的是什么。
我有一个带有许多字符串参数的类。每个参数都需要以特定的方式进行验证,我还希望有一个与每个参数关联的字符串 fieldName。但是,我仍然希望能够将参数视为普通字符串(请参阅示例)。
我可以将逻辑编码到数据中,并作为每个参数的数据伴随对象的应用方法,但我希望有更通用的东西。
将逻辑(例如参数验证)放入构造函数中是值得怀疑的。从构造函数抛出异常更是双重的。
通常,这种创建模式最好与一个或多个工厂方法或某种构建器一起使用。
对于基本工厂,只需定义一个带有您想要的工厂方法的同伴即可。如果您想要相同的简写结构符号(new
-free)你可以重载预定义的apply
(尽管您不能替换签名与case class
确切地说是构造函数)。
如果您想让客户端代码在验证失败时避免处理异常的混乱,您可以返回Option[Data]
or Either[ErrorIndication, Data]
反而。或者你可以使用 ScalaZValidation
,我将武断地声明超出了这个答案的范围(因为我对它不够熟悉......)
但是,您不能拥有在所呈现的属性方面存在差异的实例。即使是子类也不能从公共 API 中减去。如果您需要能够做到这一点,您将需要一个更复杂的构造,例如trait
对于公共部分和单独的case class
es 表示变体和/或扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)