Kotlin如何在构造外部类时实例化其内部类对象
问题原因
- Kotlin 中标记
inner的内部类会隐式持有外部类实例的引用,构造时必须传入外部类实例作为接收方,语法为外部类实例.Inner(),第一次报错就是因为缺少该接收方。 - 主构造函数的参数默认值的求值阶段,当前类的实例
this还未完成初始化,无法作为接收方使用,所以修改为this.Inner()也会报错。
可行解决方案
方案1:改用无接收方的嵌套类(更推荐)
去掉inner关键字将Inner改为普通嵌套类,显式传入依赖的外部属性x,不需要依赖外部类实例即可构造,完全规避this未初始化的问题:
import java.io.Serializable import java.util.function.Predicate data class Outer( val x: Int = 1, val predicate: Predicate<Int> = Inner(x) ) { private class Inner(private val outerX: Int) : Predicate<Int>, Serializable { override fun test(t: Int): Boolean = outerX == t } }
该方案不影响业务逻辑,Inner可以正常实现Serializable接口,也不需要调整类的对外暴露形式。
方案2:通过次构造函数提供默认值
如果必须保留Inner为内部类的实现形式,可以将默认参数的逻辑移到次构造函数中,此时已经可以拿到当前实例的引用:
import java.io.Serializable import java.util.function.Predicate data class Outer(val x: Int, val predicate: Predicate<Int>) { // 次构造函数提供默认参数,此时可正常使用this构造内部类 constructor(x: Int = 1) : this(x, this.Inner()) private inner class Inner : Predicate<Int>, Serializable { override fun test(t: Int): Boolean = x == t } }
该方案保留了inner内部类的写法,对外构造方法的调用方式和原需求完全一致。
内容的提问来源于stack exchange,提问作者OldCurmudgeon
相关产品推荐
相关产品推荐

