验证数据类参数Kotlin

gre*_*fox 14 kotlin

如果我使用Kotlin数据类对我的值对象进行建模,那么处理验证的最佳方法是什么.似乎init块是唯一的逻辑位置,因为它在主构造函数之后执行.

data class EmailAddress(val address: String) {

    init {
        if (address.isEmpty() || !address.matches(Regex("^[a-zA-Z0-9]+@[a-zA-Z0-9]+(.[a-zA-Z]{2,})$"))) {
            throw IllegalArgumentException("${address} is not a valid email address")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用JSR-303示例

其缺点是需要加载时间编织

@Configurable
data class EmailAddress(@Email val address: String) {

    @Autowired
    lateinit var validator: Validator

    init {
        validator.validate(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

asm*_*dey 0

实际上,看起来验证不是数据类的责任。data\xe2\x80\x94 本身就说明它用于数据存储。

\n\n
    \n
  1. 因此,如果您想验证数据类,那么设置将非常有意义@get:构造函数的参数设置验证并在负责构造的类中的数据类之外进行验证将是非常有意义的。

  2. \n
  3. 您的第二个选择是不使用数据类,只需使用简单的类并在构造函数中传递验证器来实现整个逻辑

  4. \n
  5. 另外,如果您使用 Spring Framework \xe2\x80\x94,您可以使此类 Bean 具有原型范围,但很可能使用这种意大利面条式代码绝对不舒服:)

  6. \n
\n