Правильное создание LiveData во ViewModel
По мере изучения Android-разработки заметил деталь, которой раньше не придавал особого значения. Так как я начинал свой путь в Андроид-разработке с языка Java, то привык использовать геттеры и сеттеры для приватных полей, что в Котлине реализовано иначе.
В Kotlin геттеры и сеттеры создаются автоматически при объявлении свойств класса. Они имеют такой же доступ к свойству, как и в Java, но в Kotlin они могут быть переопределены и иметь свою логику. Например, если у нас есть класс Person со свойством name, то геттер и сеттер для этого свойства будут выглядеть так:
class Person {
var name: String = ""
get() = field.uppercase()
set(value){
field = "Name: $value"
}
}
В данном случае геттер будет возвращать имя в верхнем регистре, а сеттер будет добавлять к имени префикс “Name: “.
class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Не уделив должного внимания данной особенности языка Kotlin, при создании
объекта LiveData я создавал приватное поле для использования внутри ViewModel, и
потом делал отдельную публичную функцию для доступа извне:
private val settingsLiveData =
MutableLiveData<List
fun settingsLiveData(): LiveData<List<SettingUI>> = settingsLiveData
В Котлине такой подход будет считаться неправильным, хотя и все же будет работать, как ожидается. Однако, Google в своем руководстве по добавлению LiveData в проект рекомендует использовать другой подход, соответствующий стилю написания программ на Kotlin:
private val _settingsLiveData = MutableLiveData<List<SettingUI>>()
val settingsLiveData: LiveData<List<SettingUI>>
get() = _settingsLiveData
Таким образом, так как геттеры и сеттеры в Kotlin создаются автоматически для каждого поля в классе, то создавать отдельную функцию-геттер не имеет смысла, правильным является вариант с переопределением геттера для существующего поля.