Kotlin类型安全构建器示例:构建指定结构的Person对象
实现Kotlin类型安全构建器创建Person对象
你已经有了一个不错的开端,只需要给Person类添加一个成员函数来支持嵌套的name{}初始化调用,就能实现你想要的构建器语法了。下面是完整的实现步骤和代码:
完整代码实现
// 定义Name数据类,保持原有结构即可 data class Name(var first: String? = null, var last: String? = null) // 完善Person类,添加用于初始化name的成员函数 data class Person(var age: Int? = null, var gender: String? = null, var name: Name? = null) { // 这个函数允许在Person的构建器lambda中直接调用name{} fun name(init: Name.() -> Unit) { val newName = Name() newName.init() // 执行Name的初始化lambda this.name = newName // 将初始化好的Name对象赋值给Person的name属性 } } // 顶层person构建函数,保持原有逻辑即可 fun person(init: Person.() -> Unit): Person { val p = Person() p.init() return p }
测试你的目标代码
现在你可以直接使用你想要的语法创建Person对象了:
fun main() { var p = person { age = 22 gender = "male" name { first = "Ali" last = "Rezaei" } } println(p) // 输出结果:Person(age=22, gender=male, name=Name(first=Ali, last=Rezaei)) }
关键原理说明
- 带接收者的lambda:
Person.() -> Unit和Name.() -> Unit这种类型的lambda,允许你在lambda内部直接访问接收者对象(比如Person或Name的成员变量),这是类型安全构建器的核心。 - 嵌套构建支持:我们给Person类添加的
name成员函数,是实现嵌套name{}调用的关键——它在Person的构建作用域内提供了一个入口,负责创建Name实例、执行其初始化逻辑,并最终将实例绑定到Person的name属性上。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

