我遇到了一个奇怪的问题.我有一个基类和一堆扩展基类的对象.我在基类中添加了一个伴随对象,其中包含了扩展基类的所有对象的列表.但是,在某些情况下,当试图调用该列表上的函数时,似乎没有初始化对象.
下面是一个基类,它包含了一个伴随对象:
abstract class MyBaseClass {
abstract fun getName(): String
companion object {
val list = listOf(Foo, Bar)
fun getByName(name: String): MyBaseClass? {
return list.firstOrNull { it.getName() == name }
}
}
}
对象在另一个文件中定义:
object Foo: MyBaseClass() {
override fun getName(): String {
return "Foo"
}
}
object Bar: MyBaseClass() {
override fun getName(): String {
return "Bar"
}
}
现在,如果我调用getByName
函数,它会抛出一个NullPointerException.但是,如果我先删除列表并打印项目,它会正确地打印出所有内容,之后,getByName
工作正常.
// Throws NPE
@Test
fun testOne() {
assertEquals(Foo, MyBaseClass.getByName("Foo"))
}
// Works correctly
@Test
fun testTwo() {
for (o in MyBaseClass.list) {
println("Object: $o")
}
assertEquals(Foo, MyBaseClass.getByName("Foo"))
}
这是故意的行为,还是我错过了什么?