我有一个看起来像这样的界面:
interface MyObject {
val id: String
val media: MutableList<Uri>
}
我想在媒体列表由MutableList<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个成员…有更好的方法来实现这一点吗?
一种选择是扩展AbstractList
,可以简单地如下:
val media = object : AbstractList<URL>() {
override val size get() = mediaStringList.size
override fun get(index: Int) = Uri.parse(mediaStringList[index])
}
这给了你一个底层mediaStringList
的只读视图:对它的任何更改都会立即反映在视图中。
Uri
。因此,只有当您需要以额外处理为代价来节省内存时,这才是一个好主意;或者当列表与检索的项目数量相比可能很大时。
如果您希望视图是可写的,您可以扩展AbstractMutableList
,并覆盖另外三个方法。(留作练习:-)
p。我建议初始化media
到这个对象,而不是在getter中创建它,因为后者将在每次调用getter时创建一个新视图,这是浪费的。(如果你担心为每个MyObjectPojo
创建一个视图,你可以把它包装在by lazy {…}
中,这样它只会在第一次需要的时候被创建——以一些同步为代价。)