如何从Kotlin内部枚举类访问外部数据类的属性?
问题原因
Kotlin 中嵌套的枚举类默认是静态嵌套类,它属于外部类本身而非外部类的某个实例。而你定义的number是MyClass的实例属性,只有当MyClass被实例化后才会存在值。静态枚举类在类加载阶段就会初始化所有枚举实例,此时根本无法访问还未创建的实例属性,因此会报“Unresolved reference: number”错误。
解决方案
根据你的需求场景,有两种可行的处理方式:
场景1:number是固定常量,不依赖MyClass实例
如果number的值不需要随MyClass实例变化,可以把它移到companion object中作为静态常量:
private data class MyClass(val num: Int) { companion object { const val number = 10 // 改为固定常量 } private enum class MyEnum(val elem: String) { VERTICAL("|"), HORIZONTAL("—"), NUMBERS((1..number).joinToString(" ")) } }
场景2:number必须依赖MyClass实例属性
由于枚举实例初始化时机的限制,这种情况下无法用枚举实现需求,你可以改用密封类或者将枚举的逻辑移到实例方法中:
方案A:用密封类替代枚举
密封类可以接收实例参数,灵活适配实例属性:
private data class MyClass(val num: Int) { val number: Int = this.num private sealed class MyElem(val elem: String) { object Vertical : MyElem("|") object Horizontal : MyElem("—") class Numbers(number: Int) : MyElem((1..number).joinToString(" ")) } // 在实例方法中创建对应元素 fun getNumbersElem() = MyElem.Numbers(number) }
方案B:将枚举作为类型标记,逻辑移到实例方法
保留枚举作为类型标识,把依赖实例属性的逻辑放到MyClass的实例方法中:
private data class MyClass(val num: Int) { val number: Int = this.num private enum class MyEnumType { VERTICAL, HORIZONTAL, NUMBERS } fun getElem(type: MyEnumType): String { return when(type) { MyEnumType.VERTICAL -> "|" MyEnumType.HORIZONTAL -> "—" MyEnumType.NUMBERS -> (1..number).joinToString(" ") } } }
内容的提问来源于stack exchange,提问作者adistroe
相关产品推荐
相关产品推荐

