将MutableLiveData公开为LiveData的正确方法?

5 android kotlin android-livedata

考虑以下公开方法MutableLiveData

方法一

class ThisViewModel : ViewModel() {

    private val _someData = MutableLiveData(true)
    val someData: LiveData<Boolean>
        get() = _someData
}

// Decompiled Kotlin bytecode

public final class ThisViewModelDecompiled extends ViewModel {

   private final MutableLiveData _someData = new MutableLiveData(true);

   @NotNull
   public final LiveData getSomeData() {
      return (LiveData)this._someData;
   }
}
Run Code Online (Sandbox Code Playgroud)

方法B

class ThatViewModel : ViewModel() {

    private val _someData = MutableLiveData(true)
    val someData: LiveData<Boolean> = _someData
}

// Decompiled Kotlin bytecode

public final class ThatViewModelDecompiled extends ViewModel {

   private final MutableLiveData _someData = new MutableLiveData(true);

   @NotNull
   private final LiveData someData;

   @NotNull
   public final LiveData getSomeData() {
      return this.someData;
   }

   public ThatViewModel() {
      this.someData = (LiveData)this._someData;
   }
}
Run Code Online (Sandbox Code Playgroud)

是否有理由使用方法B而非方法A?

Mis*_*ith 8

从 Kotlin 1.4-M2 开始,您可以简单地执行以下操作:

private val myMutableLiveData = MutableLiveData<String>()
val myLiveData : LiveData<String> by this::myMutableLiveData
Run Code Online (Sandbox Code Playgroud)

不幸的是需要它this::,否则无法编译。

我在Igor Wojda 的回答中找到了这一点,该回答讨论了其他方法。不幸的是他在这个问题上的回答被删除了。


tyn*_*ynn 5

Java的角度来看,方法A在类中的字段较少,因此“更有效”。从Kotlin的角度来看,方法B更加清楚地表明,不可更改属性是对可变属性的直接引用。而且Kotlin足够聪明,可以本地访问该字段,而不是使用getter方法。

是否有理由使用方法B而非方法A?

一般而言,仅是口味问题。从微观优化的角度来看,它取决于您是否还要在类本身内使用此引用。