Java 两个可观测值指向同一参考点

Java 两个可观测值指向同一参考点,java,android,kotlin,Java,Android,Kotlin,我编写了以下示例,并检查了对象a和b的observerA变量的值 示例 class Test { val observerA = Observer<String>{} } 结果 [A]ObserverA: com.test.Test$observerA$1@e3d8a1b [B]ObserverA: com.test.Test$observerA$1@e3d8a1b 我的猜测是a.observer和a.observer应该是不同的,但它们指的是同一个对象 当我像下面那

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

示例

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

[A]ObserverA: com.test.Test$observerA$1@e3d8a1b  
[B]ObserverA: com.test.Test$observerA$1@e3d8a1b
我的猜测是a.observer和a.observer应该是不同的,但它们指的是同一个对象

当我像下面那样编写observerA时,我看到创建了不同的对象。我不知道为什么会出现这种差异

val observerA = object : Observer<String>{
    override fun onChanged(t: String?) {

    }
}
val Observer a=object:Observer{
更改后覆盖乐趣(t:字符串?){
}
}

如果类测试是在dagger(例如依赖项注入)中使用的单例,那么它将只初始化一次,第二次将指向同一对象


使用此语法时,定义的lambda的主体为空:

Observer<String>{}
Observer{}
这个lambda将被编译成一个匿名类。如果lambda没有捕获任何变量,作为一个优化步骤,那么它只会有一个实例(因为您无论如何都无法区分行为上的差异)

正如您已经发现的,您可以通过使用完整的对象表达式语法强制编译器创建此观察器的新实例,这保证了每次都有一个新实例


上述声明来源于本书:

从Kotlin 1.0开始,每个lambda表达式都被编译成一个匿名类(…)。如果lambda捕获变量,则匿名类将为每个捕获的变量创建一个字段,并且将为每次调用创建该类的新实例。否则,将创建单个实例。类的名称是通过从声明lambda的函数名称中添加后缀来派生的(…)


非常感谢。这是一个简单的示例代码,但我遇到了很多困难。
Observer<String>{}