【问题标题】:Android : Translate in Java the Kotlin ViewModel backing field encapsulation techniqueAndroid : 在 Java 中翻译 Kotlin ViewModel 支持字段封装技术
【发布时间】:2025-05-08 12:10:02
【问题描述】:

在用 Kotlin 编写的 Android 应用中,ViewMoel 中的 LiveData 属性可以使用支持字段技术封装,如下所示:

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

如何在 Java 中翻译它以获得相同级别的封装?

【问题讨论】:

    标签: android kotlin encapsulation android-viewmodel backing-field


    【解决方案1】:

    这是一个普通的getter方法,这是转换后的java代码

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

    这是获取java代码形式kotlin

    的步骤

    在安卓工作室

    工具 -> kotlin -> 显示 kotlin 字节码 -> 反编译

    【讨论】:

    • 不再有通用类型 Int。事实上,decomile 显示一个@Metadata。在纯 Java 应用程序中使用此解决方案似乎太复杂了。还是谢谢。
    • 我已经编辑了答案,你可以使用Integer作为泛型类型
    • "this" 可以省略,因此您的解决方案与下面的 Kim Ninh 基本相同。谢谢。
    • 是的,如果你在同一个上下文中,但泛型不适用于像int*.com/questions/2721546/…这样的原始类型
    【解决方案2】:

    在Java中,类只有字段和函数,所以你可以用这样的getter创建一个私有字段来实现结果。

    private final MutableLiveData<Int> score = new MutableLiveData<>();
    
    public final LiveData<Int> getScore(){
        return score;
    }
    

    【讨论】:

    • 看起来不错。我没有意识到 MutableLiveData 可以在 LiveData 中强制转换 set 方法呢? public void setScore(Int){score.setValue(s);} 这个 setScore 是否符合封装规则?
    • 你可以像这样使用set方法。通常,我不会为实时数据字段创建设置器。只需直接用您要执行的操作命名即可。例如:resetScore(), increaseScore(), ... 在这些方法中,调用score.setValue()score.postValue() 来更新实时数据值。
    • 有道理。非常感谢
    最近更新 更多