我编写了以下示例,并检查了对象a和b的ObserverA变量的值。

示例

class Test {
    val observerA = Observer<String>{}
}

检查
val a = Test()
val b = Test()
AppLogger.LOGE("[A]ObserverA: ${a.observerA} [B]ObserverA: ${b.observerA}")

结果
[A]ObserverA: com.test.Test$observerA$1@e3d8a1b
[B]ObserverA: com.test.Test$observerA$1@e3d8a1b

我的猜测是a.observerA和a.observerA应该不同,但是它们引用的是同一对象。

当我如下编写观察者A时,我看到创建了不同的对象。我不知道为什么会出现这种差异。
val observerA = object : Observer<String>{
    override fun onChanged(t: String?) {

    }
}

最佳答案

使用此语法时,将定义一个空主体的lambda:

Observer<String>{}

该lambda将被编译为一个匿名类。如果lambda没有捕获任何变量,则作为优化步骤,将只有一个实例(因为无论如何您都无法分辨行为的差异)。

正如您已经发现的那样,您可以使用完整的对象表达式语法强制编译器创建此Observer的新实例,该语法每次都保证有一个新实例。

上面的语句的来源,来自Kotlin in Action书:

10-04 18:27