在Kotlin,如何使一个属性只能通过特定的类型访问
比方说,我有一个类似于这样的Kotlin类:
class MyKotlinExample { val mMyString = MutableLiveData<String>() }
MutableLiveData
扩展LiveData
但我不想暴露MutableLiveData
其他类。 他们应该只看到/访问LiveData<String>
作为我的特殊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
传递,以便它们只能以LiveData<String>
访问myString
。
你应该使用一个吸气剂来为你施放:
class MyKotlinExample { private val mMyString = MutableLiveData<String>() fun getNonMutableLiveData(): LiveData<String> = mMyString }
我会让这个字段是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>() }