首页 > 解决方案 > 如何支持 MutableList具有 MutableList 的字段

问题描述

我有一个看起来像这样的界面:

interface MyObject {
    val id: String
    val media: MutableList<Uri>
}

我想在媒体列表由 aMutableList<String>而不是支持的情况下实现它MutableList<Uri>(我需要的原因在我的长问题中解释。简单的方法是:

data class MyObjectPojo(
    override val id: String,
    val mediaStringList: MutableList<String>
) : Tale {
    override val media: MutableList<Uri>
        get() = mediaStringList.map { Uri.parse(it) } as MutableList<Uri>
}

但这显然效率低下(例如,为了只获取第一个元素,将对整个列表运行映射操作)。我想过get() = object : MutableList<Uri> {...},但我意识到我必须实现 20 多个成员......有没有更好的方法来实现这一点?

标签: listkotlininheritanceinterfaceuri

解决方案


一种选择是扩展AbstractList,它可以很简单:

val media = object : AbstractList<URL>() {
    override val size get() = mediaStringList.size
    override fun get(index: Int) = Uri.parse(mediaStringList[index])
}

这为您提供了底层的只读视图mediaStringList:对它的任何更改都会立即反映在视图中。

像大多数性能问题一样,这是一种权衡:它本身不存储任何数据,但需要在Uri每次检索项目时创建一个新数据。因此,仅当您需要以额外处理为代价来节省内存时,这才是一个好主意;或者当列表与检索到的项目数相比可能很大时。

如果您希望视图可写,则可以改为 extendAbstractMutableList并覆盖另外三个方法。(这留作练习:-)

PS。我建议初始化 media这个对象,而不是在 getter 中创建它,因为后者会在每次调用 getter 时创建一个新视图,这很浪费。MyObjectPojo(如果您担心为每个by lazy {…}.


推荐阅读