Kotlin:mutableList应该声明为Val还是Var?

Kotlin:mutableList应该声明为Val还是Var?,kotlin,Kotlin,我正在阅读我的团队现有的代码库,我注意到mutableListOf总是声明为val。在某些情况下,元素只会添加到mutableListOf一次。例如 val jobList = mutableListOf<JobActivity>() jobList.addAll(job.activities) 既然列表在创建时没有初始化,为什么不将mutableListOf声明为var?在线发现的许多示例也遵循与val相同的模式声明mutableListOf 在所描述的两种情况下,val或var

我正在阅读我的团队现有的代码库,我注意到
mutableListOf
总是声明为
val
。在某些情况下,元素只会添加到
mutableListOf
一次。例如

val jobList = mutableListOf<JobActivity>()
jobList.addAll(job.activities)
既然列表在创建时没有初始化,为什么不将
mutableListOf
声明为
var
?在线发现的许多示例也遵循与
val
相同的模式声明
mutableListOf


在所描述的两种情况下,
val
var
哪一种最适合使用

我认为它被声明为val,因为列表总是相同的,唯一改变的是它的元素。你永远不会做这样的事情:

joblist = anotherList
正如@Taseer所说,即使对象是val,其属性也可以更改。例如:

data class Example(var name: String)

val exampleObject = Example("SomeName")
您仍然可以这样做:

exampleObject.name = "AnotherName"
但你不能这样做:

exampleObject = anotherObject

简言之,没有规则,这取决于你

如果使用
val
,则可以修改
mutableList
,但不能重新分配


如果需要将另一个列表重新分配给同一个变量,请使用
var
。在大多数情况下,您不需要它,这就是为什么您的团队经常使用它的原因。

val
由于其他答案和评论中给出的原因,更为惯用

您说过val没有实例化,但在您的示例代码中,它是

val jobList = mutableListOf<JobActivity>()
val jobList=mutableListOf()
是实例化空
可变列表的工厂


使用此模式(
val
not
var
,在声明时实例化)可确保代码永远不会为
作业列表找到未初始化或空值;编译器可以证明这一点。

您使用可变变量(可以更改)创建一个变量。可变意味着变量可以在将来更改

val在变量将来不会更改时使用,这意味着常量或最终值

此处“更改”表示将为变量指定新值或新事物,但

val list = mutableListOf()
在此列表变量中,您指定了可变列表。您刚刚更改了列表的值。但您没有为刚刚添加的变量分配新实例或新值,也没有从列表中删除值。就这样。所以这里的列表本身是不可变的

它将是可变的,如果你做下面的事情

var list = mutableListOf()
list = mutableListOf()

对同一变量进行两次初始化。

使用
Kotlin
时的一般经验法则

val和var的差异 你可能已经知道其中的区别,但为了得到答案,我会重复一遍
var
允许您修改对象的引用,而
val
不允许更改对象的引用

可以使用
var
val
关键字安全地声明对象,但您希望在对象上使用
val
的原因(在大多数情况下)是您不希望使用对象的新实例的新引用引用该类成员。这样,您总是保留对原始对象的引用,并且可以修改对象属性

在var的情况下,虽然没有什么问题,但您仍然可以“毫无问题”地使用它。您仍然可以访问对象属性并修改它们,还可以将该类成员引用到新对象的引用

示例:

val myObject = MyObject()
myObject.something = 1 //can still modify object property.
myOjbect = MyObject() //re-referencing the object, NOT POSSIBLE


var myNewObject = MyNewObject()
myNewObject.someThing = "Hello world!" //can still modify object properties
myNewObject = MyNewObject()  //can still reference it.
为什么在“不可变”对象的情况下使用val over var? 它为您提供了不“意外”放置新引用的安全性

但是使用
val是否有任何性能优势?


答案

无论变量是
var
还是
val
都可以区分其值(参考值)可以更改(
var
=可变)还是不可更改(
val
=不可变)的变量

您应该始终努力使用
val
而不是
var
,以避免不必要的副作用(例如,在另一个线程中更改它)

对于
MutableList
,您最有可能使用
val
,因为您不想改变对列表的引用,而是要改变列表的内容

以下是您的选项概述:

// Do you want to change its reference (r) / contents (c)?
var a = mutableListOf(1, 2, 3) // r = yes, c = yes
var b = listOf(1, 2, 3)        // r = yes, c = no
val c = mutableListOf(1, 2, 3) // r = no,  c = yes
val d = listOf(1, 2, 3)        // r = no,  c = no

如果未将
作业列表
引用到可变列表的新实例,请使用
val
。该列表是一个对象,在
val
中声明的对象即使在运行时也可以更改其属性。@TaseerAhmad抱歉,我不明白答案。你能举例说明吗?当你不需要
var
@EpicPandaForce时,总是使用
val
?是否存在性能或内存影响?在这里使用var是否更昂贵?同样的原因是为什么您应该将
String
设置为
String
,而不是
String?
,如果您实际上不希望它可以为null。您的意思是:在“可变”对象的情况下,为什么要使用val而不是var?不,我的意思是
var
应该与“可变”对象一起使用。我所说的可变对象是指那些重新初始化并重新分配给已初始化对象变量的对象<另一方面,当您不打算使用新实例重新分配或重新初始化对象时,应该使用code>val
。请阅读
Kotlin
basic syntax:,Yes var用于可变对象,而“val”用于“不可变”对象。这就是为什么我想知道你为什么写“为什么在‘不可变’对象的情况下使用val而不是var?”…这是一个问题还是一个陈述?Val用于“不可变”对象。这只是一个语句。我试图描述为什么在“不可变”对象的情况下使用
val
而不是
var
。这并不是为什么您应该无缘无故地在
var
上使用
val
。这取决于您的用例。
// Do you want to change its reference (r) / contents (c)?
var a = mutableListOf(1, 2, 3) // r = yes, c = yes
var b = listOf(1, 2, 3)        // r = yes, c = no
val c = mutableListOf(1, 2, 3) // r = no,  c = yes
val d = listOf(1, 2, 3)        // r = no,  c = no