Kotlin 数据验证:库概览与实践示例
数据验证是构建可靠应用程序的关键方面之一。在 Kotlin 生态系统中,有多个成熟的库允许开发者以声明式方式描述验证规则,从而摆脱样板代码。本文将介绍三种流行的工具:Konform、Valiktor 和 Kotlinx Validation,并讨论何时以及如何选择它们。
1. Konform —— 基于 Arrow 的函数式验证
Konform 库构建于函数式框架 Arrow 之上。它利用 Validated 概念来累积错误,并支持简单及嵌套的数据结构。
安装
// build.gradle.ktsimplementation("io.konform:konform:0.4.0")使用示例
import io.konform.validation.*
data class User( val name: String, val email: String, val age: Int)
val userValidation = Validation<User> { User::name { minLength(2) hint "姓名至少包含2个字符" maxLength(50) hint "姓名不能超过50个字符" } User::email { pattern(Regex("^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$")) hint "邮箱格式不正确" } User::age { minimum(18) hint "年龄必须不小于18岁" maximum(120) hint "请输入真实年龄" }}
fun main() { val user = User("A", "invalid-email", 15) val result = userValidation(user) if (result.errors.isNotEmpty()) { result.errors.forEach { error -> println("字段: ${error.path} — ${error.message}") } } else { println("验证通过") }}特点
- 与 Arrow 完全集成,支持验证组合
- 支持嵌套对象和列表
- 类型安全的 DSL 结构
- 累积所有错误(不会在第一个错误处停止)
2. Valiktor —— 使用流畅 API 的命令式验证
Valiktor 提供了一种更传统的方法,采用流畅接口。该库不需要函数式依赖,对于熟悉 Java 的开发者来说易于上手。
安装
implementation("org.valiktor:valiktor-core:0.12.0")使用示例
import org.valiktor.functions.*import org.valiktor.validate
data class Order( val id: String, val amount: Double, val items: List<String>)
fun validateOrder(order: Order) { validate(order) { validate(Order::id).isNotBlank().hasSize(10..36) validate(Order::amount).isPositive().isLessThanOrEqualTo(10000.0) validate(Order::items).isNotEmpty().hasSize(1..50) }}
fun main() { val order = Order("", -100.0, emptyList()) try { validateOrder(order) println("订单有效") } catch (e: Exception) { println("验证错误: ${e.message}") }}特点
- API 简单易懂,无需函数式抽象
- 在第一个错误处抛出异常(快速失败模式)
- 支持通过扩展实现自定义验证器
- 易于与 Java 项目集成
3. Kotlinx Validation —— JetBrains 官方库
尽管 Kotlinx Validation 项目目前仍处于实验阶段,但它已经提供了一种有趣的方法,使用注解和反射,类似于 Javax Validation(Bean Validation)。
安装
implementation("org.jetbrains.kotlinx:kotlinx-validation:0.1.0")使用示例
i