假设我有一个类似于以下示例的 Kotlin 类:
class MyKotlinExample {
val mMyString = MutableLiveData<String>()
}
MutableLiveData
扩展了 LiveData
,但我不想将 MutableLiveData
暴露给其他类。它们只应该看到/访问我的特殊 String
类型的 LiveData<String>
这种做法可行吗?是否好的建议等等?
您可以使用备用属性:
class MyKotlinExample {
private val _myString = MutableLiveData<String>()
val myString: LiveData<String>
get() = _myString
}
LiveData<String>
。给定以下类:interface LiveData<T> {
val value: T
}
data class MutableLiveData<T>(override var value: T) : LiveData<T>
interface MyExampleInterface {
val myString: LiveData<String>
}
class MyExampleClass : MyExampleInterface {
override val myString: MutableLiveData<String> = MutableLiveData("")
}
在内部,您可以将myString
作为MutableLiveData
访问,并且您可以将MyExampleClass
的实例作为MyExampleInterface
传递,以便它们只能将myString
作为LiveData<String>
访问。
你应该使用一个可以代替你执行强制类型转换的getter:
class MyKotlinExample {
private val mMyString = MutableLiveData<String>()
fun getNonMutableLiveData(): LiveData<String> = mMyString
}
fun getNonMutableLiveData(): LiveData<String> = mMyString
看起来更好。 - gunessKotlin的创造者们听到了我们的声音,并在Kotlin 1.7中提供了一种简单的方法:
private val item = MutableLiveData<Item>()
public get(): LiveData<Item>
或者只是:
val item = MutableLiveData <Item>()
get(): LiveData <Item>
我会将字段定义为private
,并通过以下方式公开值:
class MyKotlinExample {
private val mMyString = MutableLiveData<String>()
fun getMyString(): String = mMyString.getValue()
}
LiveData<String>
,但是用MutableLiveData<String>
的实例进行初始化:class MyKotlinExample {
val mMyString: LiveData<String> = MutableLiveData<String>()
}
MyKotlinExample
类也被阻止使用 MutableLiveData
方法。 - guness