类型安全的构建器示例kotlin

时间:2018-04-11 18:14:01

标签: 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)

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:4)

您可以在name上设置Person个扩展功能,将[{1}}分配给Name,而不是将其返回:

Person

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

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

我的repository讨论DSL设计并包含示例的无耻插件。

答案 1 :(得分:2)

您需要分配到name。这最终为我工作......

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