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

时间:2019-06-08 08:53:13

标签: android kotlin android-livedata

考虑以下公开MutableLiveData的方法:

方法A

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;
   }
}

方法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;
   }
}
  

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

2 个答案:

答案 0 :(得分:5)

Java 的角度来看,方法A 在类中的字段较少,因此效率更高。从 Kotlin 的角度来看,方法B 表示得更清楚一点,即非可变属性是对可变变量的直接引用。同样, Kotlin 足够聪明,可以本地访问字段,而不是使用getter方法。

  

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

通常只是口味问题。从微观优化的角度来看,它取决于您是否还要在类本身中使用此引用。

答案 1 :(得分:0)

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

private val myMutableLiveData = MutableLiveData<String>()
val myLiveData : LiveData<String> by this::myMutableLiveData

很遗憾,this::是必需的,否则将无法编译。

我在Igor Wojda's answer中发现了这一点,该文献讨论了其他方法。不幸的是,他在这个问题上的答案已被删除。