Две наблюдаемые указывают на одну и ту же ссылку - PullRequest
0 голосов
/ 28 января 2019

Я написал следующий пример и проверил значение переменной ObserverA для объектов a и b.

Пример

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 должны быть разными, но они ссылаются на один и тот же объект.

Когда я написал Наблюдатель А, как показано ниже, я увидел, что были созданы разные объекты.Я не знаю, почему появляется эта разница.

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

    }
}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Когда вы используете этот синтаксис, вы определяете лямбду с пустым телом:

Observer<String>{}

Эта лямбда будет скомпилирована в анонимный класс.Если лямбда не захватывает какие-либо переменные, то в качестве шага оптимизации будет только один ее экземпляр (поскольку вы все равно не сможете определить разницу в поведении).

Как вы уже обнаружилиВы можете принудительно заставить компилятор создавать новые экземпляры этого Observer, используя полный синтаксис выражения объекта, который гарантирует новый экземпляр каждый раз.


Источник для приведенных выше операторов, из Kotlin in Action book:

Начиная с Kotlin 1.0 каждое лямбда-выражение компилируется в анонимный класс (...).Если лямбда захватывает переменные, у анонимного класса будет поле для каждой захваченной переменной, и для каждого вызова будет создаваться новый экземпляр этого класса.В противном случае будет создан один экземпляр.Имя класса получается путем добавления суффикса из имени функции, в которой объявлена ​​лямбда (...).

0 голосов
/ 28 января 2019

Если класс Test является синглтоном, который используется, например, в кинжале (внедрение зависимости), он будет инициализирован только один раз, и во второй раз он будет указывать на тот же объект.

https://en.wikipedia.org/wiki/Singleton_pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...