- Правильно ли я использовать
MutableList
внутри функции и просто вернуть ее (даже если тип функции List
)?
Как правило, все в порядке. Вы делаете такие вещи, если вам требуется список, который может быть изменен внутри функции, но извне вы не хотите, чтобы он был легко изменяемым (это не значит, что он не изменяем; вы все равно можете привести его к изменяемому списку). то есть firstTenInts() as MutableList
будет работать, и вы также можете изменить его снова).
Нужен ли вам этот изменяемый список в функции или нет, зависит от вас. Например, простой вызов listOf(1, 2, 3)
немедленно вернет вам List<Int>
, т.е. fun first3Ints() = listOf(1,2,3)
немедленно вернет List<Int>
.
- Нужно ли создавать локальную переменную MutableList? Нужна ли какая-нибудь локальная переменная list? Я привык (опять же, Delphi) делать что-то вроде:
Тебе не нужно, но ты можешь. Вам решать, что лучше соответствует вашим потребностям. Это также относится к вашей локальной переменной списка. Вы не обязательно нуждаетесь в нем, даже если он у вас будет, тем не менее, под капотом. Пример: * +1022 *
fun first3Ints() = listOf(1, 2, 3)
переводится примерно так:
fun first3Ints() : List<Int> {
val result = listOf(1, 2, 3)
return result
}
В меньших функциях вы по крайней мере можете сэкономить некоторые объявления переменных, используя прямые присваивания Вы также можете использовать что-то вроде apply
, also
, let
, run
или with
, чтобы преодолеть val/var
, например. (просто симуляция ... все варианты могут быть реализованы проще):
fun first3Ints() = arrayListOf().apply {
add(1) // apply allows calling all methods of the receiver directly.. (receiver = arrayListOf...)
add(2)
add(3)
}
fun first2Ints() = arrayListOf().also { // similar to apply, but now there is an 'it' available... you could also name that variable differently, e.g. using .also { result -> result.add(1) }
it.add(1)
it.add(2)
}
- Нет ли способа манипулировать значением
return
функции Котлина, кроме как с помощью другой (созданной локально) переменной?
Так что это становится да (хотя ... технически говоря, он будет один) ... это возможно, но вам нужно указать, что вы в основном хотите использовать, за исключением случая, когда вы реализуете функцию расширения. Тогда this
внутри функции расширения фактически становится объектом, для которого вы вызвали функцию.
- Наконец, я могу быть уверен, что любые локальные переменные, которые я создаю, уничтожаются, когда функция завершается, даже если я "передаю их обратно" - правильно?
... да и нет. Да, вы можете быть уверены, что при возникновении необходимости любая локальная переменная будет собираться мусором (за исключением того, что вы делаете что-то особенное). И есть также нет: вы не знаете, когда они будут уничтожены. Что касается возвращаемого значения, оно еще более особенное: вы фактически получаете только ссылку на объект, а не сам объект ... так что каким-то образом вы в основном получаете эту локальную переменную обратно. Возможно, вы захотите взглянуть на JVM / стек и кучу, а также на то, как на объекты ссылаются и хранятся ...