可以說我有一個類似的科特林類:在科特林,如何使財產只有特定類型的訪問
class MyKotlinExample {
val mMyString = MutableLiveData<String>()
}
MutableLiveData
延伸LiveData
但我不希望暴露MutableLiveData
其他類。他們應該只看到/訪問LiveData<String>
作爲我的特別String
是否有可能,和/或良好/建議等?
可以說我有一個類似的科特林類:在科特林,如何使財產只有特定類型的訪問
class MyKotlinExample {
val mMyString = MutableLiveData<String>()
}
MutableLiveData
延伸LiveData
但我不希望暴露MutableLiveData
其他類。他們應該只看到/訪問LiveData<String>
作爲我的特別String
是否有可能,和/或良好/建議等?
您可以使用backing property:
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
as LiveData<String>
。
我會做現場private
和暴露值,像這樣:
class MyKotlinExample {
private val mMyString = MutableLiveData<String>()
fun getMyString(): String = mMyString.getValue()
}
這是目前我該怎麼辦,有沒有擺脫吸氣的方式功能? – guness
不是真的,您想將一種類型的值作爲不同類型公開,因此您需要兩種不同的方式來訪問該值。 –
您應該使用一個getter它不投你:
class MyKotlinExample {
private val mMyString = MutableLiveData<String>()
fun getNonMutableLiveData(): LiveData<String> = mMyString
}
'getNonMutableLiveData():LiveData
@guness是的,它似乎更好。我編輯了我的答案:) –
這是很簡單 - 你屬性設置爲LiveData<String>
的類型,但隨着MutableLiveData<String>
實例初始化:
class MyKotlinExample {
val mMyString: LiveData<String> = MutableLiveData<String>()
}
這樣'MyKotlinExample'類也可以使用'MutableLiveData' – guness
我認爲這是答案,但它看起來很醜。 – guness
@guness看到我更新的答案。 – nhaarman
謝謝,第二個似乎是一個堅實的方法。目前決定它是否過度殺傷。 我需要學習kotlin的思維方式:P – guness