如何解决如何在字段上编码封闭类,以便可以在Kotlin中创建类型安全的DSL?
我有一个以这种方式链接在一起的POJO:
A {
value1
value2
B {
value3
...
}
}
等等,做过一百万次。
我的任务是创建以下内容:外部参与者使用XML定义来表示他们想要接收的实体/值,例如GraphQL / ProtoBuf。除此之外,我们需要使用预定义的架构创建“标准”消息,因此,外部方不仅要提供XML,而且我们的程序员还需要定义其中一些消息。 我想确保最后一部分的类型安全,所以我首先想到的是Kotlin DSL。我已经完成了大部分工作,看起来像这样:
aScope = scope(AModel) {
addField(AModel.value1)
addEntity(BModel) {
addField(BModel.value3)
}
}
object AModel {
val value1 = field<String>()
val value2 = field<Int>()
val b = relationship(to = BModel)
}
object BModel {
val value3 = field<LocalDate>()
}
这一切都已经很好,但是我希望它是类型安全的。例如,现在这是合法的:
aScope = scope(AModel) {
addField(BModel.value3)
}
为了增加复杂性,某些实体具有公共字段,因此像一只好的OO猴子一样,我给Model对象提供了其中包含更多字段的抽象超类,这很好,因为您可以执行AModel.commonField和BModel.commonField它们是不同的唯一字段:D
我认为要实现这一点,我必须以某种方式在字段上编码封闭的Model类。然后我可以做类似的事情
fun Scope<ModelClass>.addField(field: Field<ModelClass>) { ... }
但是我不知道怎么做才能做到这一点
object AModel {
val value1 = field<AModel,String>()
}
即使那样,我也无法使用公共字段,因为我似乎无法将实际的Model类向上传递给抽象超类。
欢迎提出任何建议,对不起,这本书!非常感谢您的帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。