2017-08-16 51 views
6

如果我使用Kotlin数据类为我的值对象建模,处理验证的最佳方式是什么。看起来像init块是唯一合法的地方,因为它在主构造函数之后执行。验证数据类参数Kotlin

data class EmailAddress(val address: String) { 

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

使用JSR-303例

这样做的缺点是它需要加载时间编织

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

    @Autowired 
    lateinit var validator: Validator 

    init { 
     validator.validate(this) 
    } 
} 
+0

我一直做类似于你的第一个例子,但我只是把一个明确的'验证'方法和从控制器调用它(例如,在我有一个由S填充的请求对象的情况下将引导引导为'@ RequestBody',我想验证输入。 – Kevin

回答

0

其实,它看起来像验证是不是数据类的责任。 data告诉自己 - 它用于数据存储。

  1. 所以,如果你想验证数据类,它将使完美的意义上设置构造函数的参数@get:验证和验证数据类以外的类,负责施工。

  2. 你的第二个选择是不使用数据类,只需使用简单的类,并在构造函数传递验证有实现整个逻辑

  3. 另外,如果你使用Spring框架 - 可以让这个Bean类与原型范围,但有可能是绝对不舒服的工作与这种类型的意大利面代码:)