Котлин: Должен ли mutableList быть объявлен как Val или Var? - PullRequest
0 голосов
/ 20 июня 2019

Я читаю существующую кодовую базу для моей команды и замечаю, что mutableListOf всегда объявляется как val.В некоторых сценариях элементы добавляются в mutableListOf только один раз.Например,

val jobList = mutableListOf<JobActivity>()
jobList.addAll(job.activities)

В других сценариях элементы добавляются в mutableListOf в цикле.Например,

val jobList = mutableListOf<JobActivity>()
newJobList.filterScanType(retrieveJobType(JobContext.NEW)).forEach {
    jobList.add(it)
}

Поскольку список не инициализируется при создании, почему бы не объявить mutableListOf как var?Многие примеры, найденные в сети, также следуют тому же шаблону объявления mutableListOf, что и val.

Что лучше всего использовать в 2 описанных сценариях, val или var?

Ответы [ 6 ]

4 голосов
/ 20 июня 2019

Я думаю, что он объявлен как val, потому что список всегда будет одинаковым, единственное, что меняется, это его элементы. Вы никогда не будете делать что-то вроде:

joblist = anotherList

И, как сказал @Taseer, свойства объекта могут быть изменены, даже если это val. Например:

data class Example(var name: String)

val exampleObject = Example("SomeName")

Вы все еще сможете сделать это:

exampleObject.name = "AnotherName"

Но вы не можете сделать это:

exampleObject = anotherObject
2 голосов
/ 20 июня 2019

Общее правило при использовании 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 над var в случае «неизменяемых» объектов?

Это дает вам возможность не«случайно» разместив новую ссылку.

Но есть ли какой-то выигрыш в производительности при использовании val?

Ответ : Последнее ключевое слововыгоды

2 голосов
/ 20 июня 2019

val более идиоматичен по причинам, указанным в других ответах и ​​комментариях.

Вы сказали, что val не создан, но в вашем примере кода это так.

val jobList = mutableListOf<JobActivity>()

- фабрика, которая создает пустую MutableList<JobActivity>

Использование этого шаблона (val не var, создается при объявлении) гарантирует, что ваш код никогда не найдет неинициализированное или нулевое значение для jobList; и компилятор может доказать это.

1 голос
/ 20 июня 2019

Независимо от того, является ли переменная 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
1 голос
/ 20 июня 2019

Короче говоря - нет никаких правил, это зависит от вас

если вы используете val, вы можете изменить mutableList, но не переназначать

, если вам нужно переназначить другой список ната же самая переменная, используйте var.В большинстве случаев вам это не нужно, поэтому ваша команда часто его использует

0 голосов
/ 20 июня 2019

Вы создаете переменную с переменной var, которая может изменяться.Изменяемый означает, что переменная может быть изменена в будущем.

val используется, когда переменная не будет изменена в будущем, что означает постоянную или окончательную.

Здесь изменено означает, что переменной будет присвоено новое значение или новые вещи, но

val list = mutableListOf()

в этой переменной списка вы назначили изменяемый список.Вы только что изменили значение списка.Но вы не присвоили новый экземпляр или новое значение только что добавленной переменной и удалили значение из списка.Вот и все.Так что здесь список сам по себе неизменен.

Это будет изменчиво, если вы будете делать что-то вроде ниже ...

var list = mutableListOf()
list = mutableListOf()

Две инициализации для одной и той же переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...