В приложении для Android, написанном на Kotlin, свойства LiveData в ViewMoel могут быть инкапсулированы с использованием метода резервного поля, например:
private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
get() = _score
Как я могу перевести это на Java, чтобы получить тот же уровень инкапсуляции?
это обычный метод получения, а это преобразованный код Java
private final MutableLiveData<Integer> _score = new MutableLiveData<Integer>();
@NotNull
public final LiveData<Integer> getScore() {
return this._score;
}
это шаги, чтобы получить форму кода Java kotlin
в андроид студии
инструменты -> kotlin -> показать байт-код kotlin -> декомпилировать
Я отредактировал ответ, вы можете использовать Integer как общий тип
«это» можно опустить, чтобы у вас было в основном то же решение, что и у Ким Нинь ниже. Спасибо.
да, если вы находитесь в том же контексте, но дженерики не работают с примитивными типами, такими как intstackoverflow.com/questions/2721546/…
В Java у класса есть только поле и функция, поэтому вы можете создать приватное поле с таким геттером для достижения результата.
private final MutableLiveData<Int> score = new MutableLiveData<>();
public final LiveData<Int> getScore(){
return score;
}
Выглядит неплохо. Я не понимал, что MutableLiveData<Int> можно преобразовать в LiveData<Int>. А как насчет метода set? public void setScore(Int){score.setValue(s);} Соответствует ли этот setScore правилам инкапсуляции?
Вы можете использовать метод set таким образом. Обычно я не создаю сеттер для поля оперативных данных. Просто назовите его прямо с действием, которое вы хотите сделать. Например: resetScore(), increaseScore(), ... и внутри этих методов вызовите score.setValue() или score.postValue(), чтобы обновить значение текущих данных.
Имеет смысл. Большое спасибо
Больше нет универсального типа Int. На самом деле декомилирование показывает @Metadata. Кажется слишком сложным использовать это решение в чистом Java-приложении. Спасибо, в любом случае.