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
相关产品推荐
相关产品推荐

