在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>() }