这个问题在这里已有答案:
我有一些字段是集合,可以在包含它的服务中进行变异,而其他一些服务应该能够访问它而不必自己变异 .
在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更糟糕,因为它创建了另一个字段 .
1 回答
不,这在Kotlin目前是不可能的 . 实际上,当前设计强制getter具有与整个属性相同的返回类型 .
通常,正如您所注意到的,解决方法是使用支持属性 .
或者,您可以定义具有
List
属性的接口,在类中使用MutableList
实现它,并使用接口公开该类的实例:见:a related discussion .