Kotlin:只读不可变types对可变types的内部variables的访问

在Android中学习ViewModel的时候,出现了一个像Kotlin想要解决的问题。 在下面的代码中,我们可以看到MutableLiveData值正在用来编辑值和指标。 但是,我们不希望这些可变值暴露给其他任何人,特别是Android生命周期的成员。 我们希望Android生命周期成员有权读取值但不设置它们。 因此,下面显示的3个暴露函数是LiveData 不可变类型。

是否有一个更简单或更简洁的方法来公开只能在内部进行编辑的只读值? 这看起来像Kotlin是为了避免:模板的详细程度。

class HomeListViewModel: ViewModel(){ //Private mutable data private val repositories = MutableLiveData<List>() private val repoLoadError = MutableLiveData() private val loading = MutableLiveData() //Exposed uneditable LIveData fun getRepositories():LiveData<List> = repositories fun getLoadError(): LiveData = repoLoadError fun getLoadingStatuses(): LiveData = loading init{...//Do some stuff to MutableLiveData } } 

非Android情况可能类似:

 class ImmutableAccessExample{ private val theThingToBeEditedInternally = mutableListOf() fun theThingToBeAccessedPublicly(): List = theThingToBeEditedInternally init { theThingToBeEditedInternally.add(0, "something") } } 

我不知道是否有可能避免冗长。 但是,之前我已经看到过,通常将其声明为属性。

 private val _repositories = MutableLiveData>() val repositories : LiveData> get() = _repositories 

这是约定,请参阅文档 名称中的支持属性

如果一个类有两个概念相同的属性,一个是公共API的一部分,另一个是实现细节,则使用下划线作为私有属性名称的前缀:

val没有setter,因为它是只读的,但如果你想要一个var你可以做到这一点

 var repositories = MutableLiveData>() private set var repoLoadError = MutableLiveData() private set var loading = MutableLiveData() private set 

这将给你一个私人二传手和一个公共的getter