Что делает get () при присваивании значения в Kotlin? - PullRequest
0 голосов
/ 02 декабря 2018

Код здесь назначает _showProgress для showProgress с помощью get ()

private val _showProgress = MutableLiveData<SingleLiveEventWrapper<Boolean>>()
override val showProgress : LiveData<SingleLiveEventWrapper<Boolean>>
    get() = _showProgress

Код здесь такой же, как и выше, и кажется, что нет никакой разницы при запуске кода, он делаетта же работа, что и выше.Что делает get() в приведенном выше коде?Нужно ли использовать get() при присвоении значения?

private val _showProgress = MutableLiveData<SingleLiveEventWrapper<Boolean>>()
override val showProgress : LiveData<SingleLiveEventWrapper<Boolean>> = _showProgress

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Добавим немного к ответу gidds и сконцентрируемся на сравнении с

override val showProgress : LiveData<SingleLiveEventWrapper<Boolean>> = _showProgress

. Если вы используете = ... без явного получателя, создается вспомогательное поле и _showProgress сохраняется при построениипредмет.Таким образом, есть два поля, хранящие одно и то же значение.В этом случае это не должно иметь никакого значения, кроме использования чуть большего количества памяти, но в других случаях это может:

  1. , если _showProgress было var, его можно переназначить послестроительство.Тогда, если showProgress определено с помощью get(), при доступе к нему всегда будет получено текущее значение _showProgress, но без get() будет получено начальное.

  2. Аналогично, если _showProgress было open protected и переопределено в подклассе (из-за порядка инициализации).

0 голосов
/ 02 декабря 2018

Метод get() не изменяет значение - но он меняет тип .(В любом случае, статический тип во время компиляции.)

Закрытое свойство является полем MutableLiveData.Я не знаю этот тип, но он выглядит как класс или интерфейс, который оборачивает некоторые данные (в данном случае SingleLiveEventWrapper<Boolean>) и позволяет их изменять.

Открытое свойство, однако,LiveData.Вероятно, это суперкласс или суперинтерфейс MutableLiveData, в котором отсутствуют методы, позволяющие изменять данные.Переопределенный метод getter просто возвращает значение частного свойства, но при этом он преобразует его в неизменяемый тип.

В результате код в классе может получить доступ к изменяемому полю, что другой код можеттолько получить доступ только для чтения.Таким образом, он фактически выполняет некоторую инкапсуляцию, ограничивая возможность изменения поля, в то же время позволяя видеть его.

(Вам не нужно явно вызывать метод получения; просто с помощью синтаксиса свойства myObject.showProgress вызоветgetter для вас. В Kotlin все свойства получают метод getter - и, если var setter; вам нужно только переопределить значения по умолчанию, если вы хотите другое поведение.)

...