java - 两个 observables 指向同一个引用
问题描述
我编写了以下示例并检查了对象 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 应该不同,但它们指的是同一个对象。
当我如下写observerA时,我看到创建了不同的对象。我不知道为什么会出现这种差异。
val observerA = object : Observer<String>{
override fun onChanged(t: String?) {
}
}
解决方案
当你使用这个语法时,你定义了一个空主体的 lambda:
Observer<String>{}
这个 lambda 将被编译成一个匿名类。如果 lambda 没有捕获任何变量,作为优化步骤,它将只有一个实例(因为无论如何您都无法分辨行为的差异)。
正如您已经发现的那样,您可以强制编译器Observer
通过使用完整的对象表达式语法来创建 this 的新实例,这保证每次都有一个新实例。
上述陈述的来源,来自Kotlin in Action一书:
从 Kotlin 1.0 开始,每个 lambda 表达式都被编译成一个匿名类 (...)。如果 lambda 捕获变量,匿名类将为每个捕获的变量提供一个字段,并且将为每次调用创建该类的新实例。否则,将创建一个实例。类的名称是通过从声明 lambda 的函数名称中添加后缀 (...) 来派生的。
推荐阅读
- java - 如何使用序列化从 txt.datei 加载多个对象实例
- java - 我希望我的 Eclipse Java 套接字客户端接收可变数量或数据包
- python - 没有opencv的Python Camshift算法
- javascript - addTableRow 在模板中带有一个键和一个主题
- python - 在 Python 中绘制椭球体
- javascript - 错误类型错误:无法读取未定义的属性“pageIndex”
- javascript - JavaScript 调用堆栈中的变量如何在函数返回后仍可访问
- python - 如果我将对象的名称作为字符串并且在 python 中具有属性,如何访问对象的属性?
- pandas - 使用 pd.Series.str.contains 查找列中是否存在字符串
- date - 从纪元时间转换为 (dd/mm/yyyy) 日期格式