Validación de datos en Kotlin: revisión de bibliotecas y ejemplos prácticos
La validación de datos es uno de los aspectos clave en el desarrollo de aplicaciones confiables. En el ecosistema de Kotlin existen varias bibliotecas maduras que permiten describir reglas de validación de forma declarativa, liberando al desarrollador de código repetitivo. En este artículo analizaremos tres herramientas populares: Konform, Valiktor y Kotlinx Validation, y discutiremos cuándo y qué herramienta elegir.
1. Konform — validación funcional basada en Arrow
La biblioteca Konform está construida sobre el framework funcional Arrow. Utiliza el concepto de Validated para acumular errores y admite tanto estructuras de datos simples como anidadas.
Instalación
// build.gradle.ktsimplementation("io.konform:konform:0.4.0")Ejemplo de uso
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 "El nombre debe contener al menos 2 caracteres" maxLength(50) hint "El nombre no debe exceder los 50 caracteres" } User::email { pattern(Regex("^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$")) hint "Correo electrónico no válido" } User::age { minimum(18) hint "La edad debe ser al menos 18 años" maximum(120) hint "Indique una edad real" }}
fun main() { val user = User("A", "invalid-email", 15) val result = userValidation(user) if (result.errors.isNotEmpty()) { result.errors.forEach { error -> println("Campo: ${error.path} — ${error.message}") } } else { println("Validación exitosa") }}Características
- Integración completa con Arrow para composición de validaciones
- Soporte para objetos anidados y listas
- Construcciones DSL type-safe
- Acumulación de todos los errores (no se detiene en el primero)
2. Valiktor — validación imperativa con API fluida
Valiktor ofrece un enfoque más tradicional utilizando una interfaz fluida. La biblioteca no requiere dependencias funcionales y es fácil de aprender para desarrolladores familiarizados con Java.
Instalación
implementation("org.valiktor:valiktor-core:0.12.0")Ejemplo de uso
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("Pedido válido") } catch (e: Exception) { println("Error de validación: ${e.message}") }}Características
- API simple y clara sin abstracciones funcionales
- Lanza una excepción en el primer error (modo fail-fast)
- Soporte para validadores personalizados mediante extensiones
- Fácil integración con proyectos Java
3. Kotlinx Validation — biblioteca oficial de JetBrains
Aunque el proyecto Kotlinx Validation aún se encuentra en fase experimental, ya ofrece un enfoque interesante con anotaciones y reflexión, similar a Javax Validation (Bean Validation).
Instalación
implementation("org.jetbrains.kotlinx:kotlinx-validation:0.1.0")Ejemplo de uso
i