让我们假设一个使用构建器模式构造的对象。
此构建器模式将包含一个build
专注于字段验证然后转换为目标类型的方法。
可以使用以下方式实现此验证:
Either[FailureObject, TargetObject]
类型Try[TargetObject]
(Scala 2.10 的新功能)Validation[FailureObject, TargetObject]
或ValidationNEL[FailureObject, TargetObject]
来自 scalaz 库
Validation
我读到过Either
类型的主要优点之一是Validation
可以“开箱即用”累积故障。
但是“新”Try
方式呢?我注意到它Try
也有开箱即用的“单子”方法,比如map
,flatMap
等等......在没有Projection
.
因此,我想每个字段验证方法都返回 a Try[FieldType]
,更准确地说,如果出现任何故障, a Try[SpecificFieldExceptionType]
; 这个嵌套的包含一个String
message 字段和一个 rootCause 字段,可以在整个build
方法中累积。
使用 Scala 2.10,是否可以或应该Try
练习替换 scalaz 验证库以进行简单的验证,如构建器模式所涉及的?
**编辑* ***
通过阅读Try
源代码,听起来Try
无法累积多个异常,因此面向快速失败。EvenTry.flatMap
返回潜在的先前失败,因此没有累积的概念:
def flatMap[U](f: T => Try[U]): Try[U] = this.asInstanceOf[Try[U]]
相反ValidationNEL
,处理累积功能。
有什么确认吗?