在Kotlin中,如何使属性仅对特定类型可访问?

5

假设我有一个类似于以下示例的 Kotlin 类:

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

MutableLiveData 扩展了 LiveData,但我不想将 MutableLiveData 暴露给其他类。它们只应该看到/访问我的特殊 String 类型的 LiveData<String>

这种做法可行吗?是否好的建议等等?

5个回答

5

您可以使用备用属性:

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>访问。


我认为这是答案,但它看起来很丑。 - guness
谢谢,第二个看起来是一个可靠的方法。目前正在决定是否过度设计。我需要学习 Kotlin 的思维方式 :P - guness
首先点赞。这是最简单的方法来实现这个功能。请注意,私有的后备字段没有getter/setter,与Java字段相同。 - holi-java

1

你应该使用一个可以代替你执行强制类型转换的getter:

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

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

1
fun getNonMutableLiveData(): LiveData<String> = mMyString 看起来更好。 - guness

0

Kotlin的创造者们听到了我们的声音,并在Kotlin 1.7中提供了一种简单的方法:

private val item = MutableLiveData<Item>()
    public get(): LiveData<Item>

或者只是:

val item = MutableLiveData <Item>()
    get(): LiveData <Item>

注意:目前仍需选择加入并且支持有限,因此我们需要等待更长时间以获取稳定版本。

0

我会将字段定义为private,并通过以下方式公开值:

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

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

这是我目前的做法,有没有办法摆脱getter函数? - guness
其实不然——你想将一种类型的值暴露为另一种类型,因此你需要两种不同的访问方式来访问该值。 - Bryan Herbst

-1
这很简单 - 你将属性的类型设置为LiveData<String>,但是用MutableLiveData<String>的实例进行初始化:
class MyKotlinExample {
    val mMyString: LiveData<String> = MutableLiveData<String>()
}

1
这样,MyKotlinExample 类也被阻止使用 MutableLiveData 方法。 - guness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接