You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:49:21