Android: перевод на Java метода инкапсуляции резервного поля Kotlin ViewModel

В приложении для Android, написанном на Kotlin, свойства LiveData в ViewMoel могут быть инкапсулированы с использованием метода резервного поля, например:

private val _score = MutableLiveData<Int>()
val score: LiveData<Int>
    get() = _score

Как я могу перевести это на Java, чтобы получить тот же уровень инкапсуляции?

1
0
273
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

это обычный метод получения, а это преобразованный код Java

private final MutableLiveData<Integer> _score = new MutableLiveData<Integer>();

@NotNull
public final LiveData<Integer> getScore() {
    return this._score;
}

это шаги, чтобы получить форму кода Java kotlin

в андроид студии

инструменты -> kotlin -> показать байт-код kotlin -> декомпилировать

Больше нет универсального типа Int. На самом деле декомилирование показывает @Metadata. Кажется слишком сложным использовать это решение в чистом Java-приложении. Спасибо, в любом случае.

u2gilles 12.12.2020 12:56

Я отредактировал ответ, вы можете использовать Integer как общий тип

Mohammed Alaa 12.12.2020 14:15

«это» можно опустить, чтобы у вас было в основном то же решение, что и у Ким Нинь ниже. Спасибо.

u2gilles 12.12.2020 17:14

да, если вы находитесь в том же контексте, но дженерики не работают с примитивными типами, такими как intstackoverflow.com/questions/2721546/…

Mohammed Alaa 12.12.2020 19:26
Ответ принят как подходящий

В 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 правилам инкапсуляции?

u2gilles 12.12.2020 13:05

Вы можете использовать метод set таким образом. Обычно я не создаю сеттер для поля оперативных данных. Просто назовите его прямо с действием, которое вы хотите сделать. Например: resetScore(), increaseScore(), ... и внутри этих методов вызовите score.setValue() или score.postValue(), чтобы обновить значение текущих данных.

Kim Ninh 12.12.2020 13:42

Имеет смысл. Большое спасибо

u2gilles 12.12.2020 17:09

Другие вопросы по теме