Нужно ли мне добавлять get () для переменной val в Kotlin? - PullRequest
1 голос
/ 27 мая 2020

Код A взят из художественного LiveData с SnackBar, Navigation и другими событиями (случай SingleLiveEvent) .

navigateToDetails - это переменная val, поэтому я думаю, что Code B может выполнять ту же работу, верно?

Code A

class ListViewModel : ViewModel {

    private val _navigateToDetails = MutableLiveData<Event<String>>()    
    val navigateToDetails : LiveData<Event<String>>  get() = _navigateToDetails

    fun userClicksOnButton(itemId: String) {
        _navigateToDetails.value = Event(itemId)  // Trigger the event by setting a new Event as a new value
    }
}

Код B

class ListViewModel : ViewModel {

    private val _navigateToDetails = MutableLiveData<Event<String>>()    
    val navigateToDetails : LiveData<Event<String>> = _navigateToDetails

    fun userClicksOnButton(itemId: String) {
        _navigateToDetails.value = Event(itemId)  // Trigger the event by setting a new Event as a new value
    }
}

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Да, get() здесь не нужен.

Добавление get() приводит к повторной оценке выражения после = при каждом доступе к свойству. В этом случае он просто указывает на свойство, доступное только для чтения, поэтому в любом случае он будет вычислять одинаково каждый раз. Если выражение указывает на изменяемое свойство или, возможно, было оператором when, основанным на каком-то изменяемом свойстве, вы можете использовать явный метод получения, чтобы базовое значение изменялось при изменении состояния объекта. И наоборот, если вы хотите, чтобы выражение вычислялось только один раз во время инициализации и после этого всегда возвращало одно и то же значение, независимо от того, что, вы не захотите определять геттер.

Обратите внимание, что get() = - это сокращение для get() { /* ... */ }, подобное сокращению, которое вы можете использовать при написании функций с одним выражением. get() означает, что вы определяете функцию получения для свойства. Пустой = означает, что вы присваиваете значение вспомогательному полю во время инициализации.

1 голос
/ 27 мая 2020

Точка get() там второстепенная, но она существует; код B хранит одну и ту же ссылку в двух полях и поэтому использует немного больше памяти для каждого экземпляра этого класса. Конечно, в этом случае, вероятно, будет несколько экземпляров ListViewModel, поэтому на практике это вряд ли будет иметь значение.

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