我有一些字段是集合,可以在包含它的服务中进行变异,而其他一些服务应该能够访问它而不必自己变异。
在java中它可以像这样实现:
public class Test {
private final List<Integer> list = new ArrayList<>();
public List<Integer> getList() {
return Collections.unmodifiableList(list);
}
}
在kotlin中,我将此字段存储为MutableList
:
val someCollection: MutableList<Int> = ArrayList()
get() = unmodifiableList(field)
但是getter显然会返回类型为MutableList
的对象。
理想情况下,我希望实现这样的目标:
val someCollection: MutableList<Int> = ArrayList()
get() = unmodifiableList(field) as List // <-- returns List instead of MutableList
换句话说,可能会更改生成的getter的签名以返回另一个接口。最有可能的答案是否定的,我想知道为什么?它被认为是一种不好的做法吗?
我看到有可能做这样的事情:
private val _someCollection: MutableList<Int> = ArrayList()
val someCollection: List<Int>
get() = unmodifiableList(field)
但它确实比手动创建的getter更糟糕,因为它创建了另一个字段。
答案 0 :(得分:1)
不,Kotlin目前无法做到这一点。实际上,当前设计强制getter具有与整个属性相同的返回类型。
通常,正如您所注意到的,解决方法是使用支持属性。
或者,您可以定义具有List
属性的接口,在类中使用MutableList
实现它,并使用接口公开该类的实例:
interface SomeInterface {
val someList: List<Int>
}
internal class SomeClass : SomeInterface {
override val someList: MutableList<Int> = mutableListOf()
}
fun getSomeInterface(): SomeInterface =
SomeClass().apply { someList += listOf(1, 2, 3) }
请参阅:a related discussion。