2017-08-07 37 views
2

可以說我有一個類似的科特林類:在科特林,如何使財產只有特定類型的訪問

class MyKotlinExample { 
    val mMyString = MutableLiveData<String>() 
} 

MutableLiveData延伸LiveData但我不希望暴露MutableLiveData其他類。他們應該只看到/訪問LiveData<String>作爲我的特別String

是否有可能,和/或良好/建議等?

回答

2

您可以使用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("") 
} 

內部,您可以訪問myStringMutableLiveData,你可以傳遞MyExampleClassMyExampleInterface所以他們只能訪問實例myString as LiveData<String>

+0

我認爲這是答案,但它看起來很醜。 – guness

+0

@guness看到我更新的答案。 – nhaarman

+0

謝謝,第二個似乎是一個堅實的方法。目前決定它是否過度殺傷。 我需要學習kotlin的思維方式:P – guness

0

我會做現場private和暴露值,像這樣:

class MyKotlinExample { 
    private val mMyString = MutableLiveData<String>() 

    fun getMyString(): String = mMyString.getValue() 
} 
+0

這是目前我該怎麼辦,有沒有擺脫吸氣的方式功能? – guness

+0

不是真的,您想將一種類型的值作爲不同類型公開,因此您需要兩種不同的方式來訪問該值。 –

1

您應該使用一個getter它不投你:

class MyKotlinExample { 
    private val mMyString = MutableLiveData<String>() 

    fun getNonMutableLiveData(): LiveData<String> = mMyString 
} 
+1

'getNonMutableLiveData():LiveData = mMyString'好像更好 – guness

+0

@guness是的,它似乎更好。我編輯了我的答案:) –

-1

這是很簡單 - 你屬性設置爲LiveData<String>的類型,但隨着MutableLiveData<String>實例初始化:

class MyKotlinExample { 
    val mMyString: LiveData<String> = MutableLiveData<String>() 
} 
+0

這樣'MyKotlinExample'類也可以使用'MutableLiveData' – guness