Kotlin实例化类时能否引用构造函数已定义的属性?
Kotlin实例化类时引用构造函数参数的方法
你想在实例化类时,直接用构造函数里已定义的参数给其他属性赋值,比如你写的Order(id = orderId, transformedId = transform(id))这种写法,直接这么写是不行的——因为在构造函数的参数列表里,id还没被赋值为实例的属性,编译器会把这里的id当成当前作用域的变量,而非构造参数,所以会报错。
下面给你几种可行的解决办法:
1. 新增次级构造函数
把transform的逻辑放到次级构造函数里,主构造函数保留原有定义:
data class Order( val id: String, val transformedId: String ) { // 次级构造函数接收id,自动生成transformedId constructor(id: String) : this(id, transform(id)) }
实例化时直接传id即可:
val order = Order(getOrderId())
2. 用伴生对象写工厂方法
如果不想加次级构造函数,可以通过伴生对象提供实例创建入口:
data class Order( val id: String, val transformedId: String ) { companion object { fun fromId(id: String) = Order(id, transform(id)) } }
调用方式:
val order = Order.fromId(getOrderId())
3. 把transformedId改成派生属性(推荐如果它仅依赖id的话)
如果transformedId完全由id派生而来,没必要把它作为构造参数,直接做成类的属性,通过getter计算:
data class Order(val id: String) { // 每次访问时计算transformedId val transformedId: String get() = transform(id) }
如果transform操作耗时,或者不想每次访问都重复计算,可以用lazy懒加载:
data class Order(val id: String) { // 第一次访问时计算,之后缓存结果 val transformedId: String by lazy { transform(id) } }
这种方式实例化最简洁:
val order = Order(getOrderId())
内容的提问来源于stack exchange,提问作者StoicoProm
相关产品推荐
相关产品推荐

