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

Kotlin中如何从伴生对象访问类/接口的属性

问题核心

你遇到的本质问题是:伴生对象属于类/接口的静态层面,无法访问实例级别的抽象属性。不管用接口还是抽象类的伴生对象,都拿不到子类实例里的property值——因为necessaryData是静态初始化的,而property是每个测试类实例独有的,两者生命周期完全不重叠。

可行实现方案

方案一:将necessaryData改为实例级延迟初始化属性

把necessaryData放到实例层面,用lazy延迟初始化,确保子类已经赋值property后再计算数据。用抽象类实现的示例:

abstract class AbstractTest {
    abstract val property: Property

    // 延迟初始化,依赖子类已实现的property
    val necessaryData by lazy { getInformation(property.data) }

    @Test
    fun `dummy test`() {
        // 直接使用necessaryData即可
        println(necessaryData)
    }
}

class FirstClassTest : AbstractTest() {
    override val property = Property(data = "true data")
}

class SecondClassTest : AbstractTest() {
    override val property = Property(data = "another data")
}

如果想用接口,也可以借助Kotlin的接口默认实现:

interface InterfaceTest {
    val property: Property

    // 用get()方法动态获取,每次调用都会基于当前实例的property计算
    val necessaryData get() = getInformation(property.data)

    @Test
    fun `dummy test`() {
        println(necessaryData)
    }
}

class FirstClassTest : InterfaceTest {
    override val property = Property(data = "true data")
}

方案二:子类显式实现必要数据

如果necessaryData的逻辑需要更灵活,可以把它定义为抽象属性,让子类直接实现:

abstract class AbstractTest {
    abstract val necessaryData: String

    @Test
    fun `dummy test`() {
        println(necessaryData)
    }
}

class FirstClassTest : AbstractTest() {
    override val necessaryData = getInformation("true data")
}

class SecondClassTest : AbstractTest() {
    override val necessaryData = getInformation("another data")
}

方案三:利用测试框架的初始化钩子(JUnit场景)

如果是JUnit 5测试,可以用@BeforeEach在每个测试方法执行前初始化数据,确保拿到当前实例的property:

abstract class AbstractTest {
    abstract val property: Property
    lateinit var necessaryData: String

    @BeforeEach
    fun setup() {
        necessaryData = getInformation(property.data)
    }

    @Test
    fun `dummy test`() {
        println(necessaryData)
    }
}

class FirstClassTest : AbstractTest() {
    override val property = Property(data = "true data")
}

内容的提问来源于stack exchange,提问作者Ilya Simanavets

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:42:39