Как сделать статический массив в Котлине?

Я пытаюсь создать статический массив в Котлине. Для этого я создал класс 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блокировать.

Другие вопросы по тегам