类型安全的构建器示例 Kotlin



我想在 Kotlin 中有以下人员对象:

       var p = person {
            age = 22
            gender = "male"
            name {
                first = "Ali"
                last = "Rezaei"
            }
        }

我有以下代码来构建它:

data class Person(var age: Int? = null, var gender: String? = null
                      , var name : Name? = null) {
    }
    fun name(init: Name.() -> Unit): Name {
        val n = Name()
        n.init()
        return n
    }
    data class Name(var first: String? = null, var last : String? = null)
    fun person(init: Person.() -> Unit): Person {
        val p = Person()
        p.init()
        return p
    }

但是当我打印它时,结果如下:

Person(age=22, gender="male", name=null)

我的代码有什么问题?

您可以在Personname创建一个扩展函数,将Name分配给Person而不是返回它:

fun Person.name(init: Name.() -> Unit) {
    val n = Name()
    n.init()
    this.name = n
}

您甚至可以考虑使用更简洁的语法,如下所示:

fun Person.name(init: Name.() -> Unit) {
    this.name = Name().apply(init)
}

我的存储库讨论DSL设计和包含示例的无耻插件。

您需要

分配给name 。 这最终对我有用...

var p = person {
    age = 22
    gender = "male"
    name = name {
        first = "Ali"
        last = "Rezaei"
    }
}

最新更新