You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EasyRandom未执行Kotlin数据类初始化块问题求助

问题分析

EasyRandom默认通过反射直接给类字段赋值,完全绕开了构造函数调用流程——而Kotlin的init块是和构造函数绑定执行的,所以你的校验逻辑根本没触发,才会出现所有字段非空的违规实例。

解决方案

1. 强制EasyRandom使用构造函数实例化

修改EasyRandom配置,让它必须通过构造函数创建对象,这样init块就会被执行,校验规则也会生效:

val parameters = EasyRandomParameters()
    .setUseConstructor(true) // 强制走构造函数流程
val easyRandom = EasyRandom(parameters)
val leeftijd = easyRandom.nextObject(Leeftijd::class.java)

这时你会发现代码直接抛出IllegalArgumentException——这是正常现象,说明init块的校验生效了,接下来需要告诉EasyRandom如何生成符合约束的参数组合。

2. 自定义实例生成逻辑适配约束

因为不同operator对应不同的字段非空规则,需要给EasyRandom指定Leeftijd类的专属生成逻辑,这里可以用自定义ObjectFactory实现:

class LeeftijdFactory : ObjectFactory<Leeftijd> {
    override fun createInstance(type: Class<out Leeftijd>, randomizerContext: RandomizerContext): Leeftijd {
        val random = randomizerContext.random
        val operator = Leeftijd.LeeftijdOperator.values().random(random)
        return when(operator) {
            Leeftijd.LeeftijdOperator.IS_GELIJK_AAN,
            Leeftijd.LeeftijdOperator.JONGER_DAN,
            Leeftijd.LeeftijdOperator.OUDER_DAN -> {
                Leeftijd(operator, leeftijd = random.nextInt(0, 120))
            }
            Leeftijd.LeeftijdOperator.TUSSEN -> {
                val min = random.nextInt(0, 100)
                val max = random.nextInt(min, 120)
                Leeftijd(operator, leeftijdMin = min, leeftijdMax = max)
            }
        }
    }
}

然后把这个工厂注册到EasyRandom:

val parameters = EasyRandomParameters()
    .registerObjectFactory(Leeftijd::class.java, LeeftijdFactory())
val easyRandom = EasyRandom(parameters)
val validLeeftijd = easyRandom.nextObject(Leeftijd::class.java)

这样生成的实例会完全符合init块的约束,同时init块也会被正常执行(因为是通过构造函数创建对象)。

3. 额外提示:修正枚举值拼写问题

你代码里when分支用了TUSSEN_LEEFTIJDEN,但枚举定义的是TUSSEN,这会导致编译错误,记得先修正这个问题,否则init块本身就无法正常运行。

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:10:04