考虑以下公开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?
答案 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中发现了这一点,该文献讨论了其他方法。不幸的是,他在这个问题上的答案已被删除。