Как сделать статический массив в Котлине?
Я пытаюсь создать статический массив в Котлине. Для этого я создал класс Object, а внутри него объявил
mutableListOf<PersonModel>()
.
Когда я пытаюсь добавить новый
Object PersonModel
в массив, я получаю красное подчеркивание, указывающее на ошибку в последней строке, в которой говорится
Expecting member declaration
.
Код
object Data {
val array = mutableListOf<PersonModel> (PersonModel("roshan",65,50,"White",21,"male"))
array.add(PersonModel("roshan",65,50,"White",21,"male"))
}
2 ответа
Вы не можете использовать произвольный исполняемый код внутри объявления объекта/класса. Этот блок кода предназначен только для определения членов класса. Если вы хотите выполнить некоторый код при создании экземпляра класса, вы можете использовать блок инициализации:
object Data {
val array = mutableListOf<PersonModel> (PersonModel("roshan",65,50,"White",21,"male"))
init {
array.add(PersonModel("roshan",65,50,"White",21,"male"))
}
}
Если вы предпочитаете хранить код инициализации для члена в одном месте, распространенным шаблоном является , например,
использование функции области видимости .run()
или же
apply()
:
val array = mutableListOf<PersonModel>().apply {
add(PersonModel("roshan",65,50,"White",21,"male"))
add(PersonModel("roshan",65,50,"White",21,"male"))
}
В вашем конкретном случае вам не нужно этого делать, потому что вы можете создать список с обоими элементами напрямую:
val array = mutableListOf<PersonModel> (
PersonModel("roshan",65,50,"White",21,"male"),
PersonModel("roshan",65,50,"White",21,"male"),
)
Как написал user13308991 в комментариях, нельзя добавлять произвольные утверждения, такие как
array.add(...)
в тело объявления объекта (или класса).
Чтобы получить статически инициализированную глобально доступную переменную (или значение) в Kotlin, у вас есть несколько вариантов.
Декларация верхнего уровня
В Котлине вы можете объявить
var
возможности /
val
уэс и
fun
действия на верхнем уровне без необходимости использования объекта-оболочки (или класса).
package com.example.models
val availablePersonModels = listOf(
PersonModel("roshan", 65, 50, "White", 21, "male")
)
import com.example.models.availablePersonModels
fun foo() {
for (availablePersonModel in availablePersonModels) {
println(availablePersonModel)
}
}
Если вы хотите иметь возможность добавлять/удалять элементы из списка после инициализации, просто замените на .
Объявление объекта
Если вы хотите сгруппировать несколько объявлений вместе или сделать контекст объявления более явным, вы можете обернуть объявление в файл .
object ModelProvider {
val availablePersonModels = listOf(
PersonModel("roshan", 65, 50, "White", 21, "male")
)
}
import com.example.models.ModelProvider
fun foo() {
for (availablePersonModel in ModelProvider.availablePersonModels) {
println(availablePersonModel)
}
}
Инициализация статических значений с помощью операторов
В
listOf
а также
mutableListOf
вызовы функций поддерживают передаваемые значения для добавления к созданному
List
, поэтому вам НЕ нужно вызывать
add(...)
как часть инициализации. Однако так должно быть не всегда. Например, могут быть классы, экземпляры которых необходимо создать с помощью пустого конструктора и заполнить значениями путем последующего вызова сеттеров.
class ExampleClass {
var x: Int? = null
var y: Int? = null
}
Используя вышеприведенное объявление объекта, вы можете захотеть добавить такие вызовы в
constructor
из , например:
object ModelProvider {
val exampleValue = ExampleClass()
init {
exampleValue.x = 1
exampleValue.y = 1
}
}
Вместо разделения инициализации и заполнения, как указано выше, вы также можете использовать одно выражение для обоих, например, используя одну из функций области видимости, такую как
apply
, например:
val exampleValue = ExampleClass().apply {
x = 1
y = 1
}
Конечно, это можно использовать внутри
object
а также устранение необходимости в
init
блокировать.