在Kotlin,如何使属性只能通过特定类型访问

时间:2017-08-07 14:37:51

标签: android kotlin

假设我有类似的Kotlin类:

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

MutableLiveData延伸LiveData但我不想将MutableLiveData公开给其他课程。他们只能看到/访问LiveData<String>作为我的特殊String

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

4 个答案:

答案 0 :(得分:4)

您可以使用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访问LiveData<String> {1}}。

答案 1 :(得分:1)

你应该使用一个为你做演员的getter:

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

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

答案 2 :(得分:0)

我会创建字段private并公开值,如下所示:

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

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

答案 3 :(得分:-1)

这很简单 - 您将属性的类型设置为LiveData<String>,但使用MutableLiveData<String>的实例初始化它:

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