【发布时间】:2020-05-05 18:49:54
【问题描述】:
我目前正在学习 Kotlin DSL。
我已经玩了一段时间了,但我无法解决我的用例。我有一个简单的 DSL,我不太关心它的类型,只要我能实现这样的语法:
private fun getObj(): SET {
return SET {
ITEM {
A = null
B = "Hello world"
C
// D - exists in DSL but omitted here
}
}
}
在后台,我现在想区分ITEM 块中设置的某些值。 B 很简单,只是价值,但对于 A 和 C 来说就很难了。不知何故,我无法区分 null 和 no value 集。目前我的构建器看起来像这样,但我愿意更改它以实现上述语法:
class ITEMBuilder {
var A: String? = null
var B: String? = null
var C: String? = null
var D: String? = null
fun build() = ITEM(
ItemValue(A),
ItemValue(B),
ItemValue(C),
ItemValue(D)
)
}
class ItemValue(val include: Boolean? = false, val value: String? = null) {
constructor(value: String? = null): this(null != value, value)
}
当我得到最终对象时,我希望能够为 ITEM 下的每个字段区分 4 个不同阶段:
- 值集
- 空集
- 未设置值
- 字段省略
我尝试了不同的类型,但没有运气,因为大多数事情都会影响语法。我还尝试更改构建器中的 getter/setter,以便在那里捕获更新并有一个额外的内部属性被更新 - 但 get 或 set 都不会调用 null/no 值。还尝试将字段更改为函数,但后来我在 DSL 语法中有难看的括号 ()。
如果有人能帮我解决这个问题,那就太好了。
提前致谢!
【问题讨论】:
标签: kotlin dsl kotlin-dsl