Kotlin:在

时间:2018-05-28 19:03:49

标签: java collections kotlin

我有一些字段是集合,可以在包含它的服务中进行变异,而其他一些服务应该能够访问它而不必自己变异。

在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 个答案:

答案 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