为什么专家将MutableList更改为List?

时间:2018-01-20 06:16:58

标签: kotlin

我在How to design a complex class which incude some classes to make expansion easily in future in Kotlin?问了一个问题,关于如何设计一个复杂的课程,这个课程包含了一些课程,以便将来在Kotlin中轻松扩展。

名为s1m0nw1的专家给出了一个很好的答案,如下面的代码。

但我不知道他为什么要在https://stackoverflow.com/posts/47960036/revisionsMutableList更改为List,我可以在使用MutableList时获得正确的结果。你能告诉我吗?

代码

interface DeviceDef
data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef 


class MDetail(val _id: Long, val devices: List<DeviceDef>) {

    inline fun <reified T> getDevice(): T {
        return devices.filterIsInstance(T::class.java).first()
    }
}

已添加

我认为mutableListOf<DeviceDef>ListOf<DeviceDef>更好,以便将来延长。

当我添加aMutableList.add()的新元素时,我可以使用mutableListOf<DeviceDef>函数进行扩展。

如果我使用ListOf<DeviceDef>,我必须使用listOf(mBluetoothDef1, mWiFiDef1, //mOther)来构建它,它不是很好。正确?

var aMutableList= mutableListOf<DeviceDef>()

var mBluetoothDef1= BluetoothDef(true)
var mWiFiDef1= WiFiHelper(this).getWiFiDefFromSystem()

aMutableList.add(mBluetoothDef1)
aMutableList.add(mWiFiDef1)

// aMutableList.add(mOther)  //This is extension

var aMDetail1= MDetail(myID, aMutableList)

1 个答案:

答案 0 :(得分:5)

很抱歉首先没有给出解释。差异在docs。:

中解释
  

与许多语言不同,Kotlin区分可变不可变集合(列表,集合,地图等)。 精确控制何时可以编辑集合对于消除错误和设计良好的API非常有用。

     

重要的是要预先了解可变集合的只读视图与实际不可变集合之间的区别。两者都很容易创建,但类型系统并没有表达差异,因此跟踪它(如果它是相关的)取决于你。

     

Kotlin List<out T>类型是一个提供只读操作的界面,如size,get等。与Java一样,它继承自Collection<T>,而后者继承自Iterable<T>。更改列表的方法由MutableList<T>接口添加。 [...]

List接口提供了一个只读视图,因此您无法在列表中添加新元素,这在多线程环境中具有许多优点。在某些情况下,您可能会使用MutableList

我还建议以下讨论: Kotlin and Immutable Collections?

编辑(添加内容):

你可以这样做,没有任何add调用:

val list = listOf(mBluetoothDef1, mWiFiDef1)