Как определить статический блок инициализации вне классов в Kotlin? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть служебный файл Utility.kt

Здесь я определил некоторые константы, такие как

val DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd")
const val UTC_TIMEZONE = "UTC"

Теперь мне нужно определить список из 2 элементов.Я не могу найти способ написать это статическим способом.Мне нужно что-то вроде

val DEFAULT_LIST = ArrayList<MyObj>()
val one = MyObj("one")
val two = MyObj("two")
DEFAULT_LIST.addAll(one,two)

т.е. создать список и объекты только один раз.Я могу использовать объект-компаньон.Но сейчас я просто использую файл без классов.

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Если я понимаю вопрос, обычный способ с функцией listOf().

Если вам не нужно хранить отдельные ссылки на два объекта, вы можете просто сделать:

val DEFAULT_LIST = listOf(MyObj("one"), MyObj("two"))

Или, если вы делаете:

val one = MyObj("one")
val two = MyObj("two")
val DEFAULT_LIST = listOf(one, two)

Если вы хотите больше контроля над точным типом списка, вы можете использовать mutableListOf(), или arrayListOf(), или вызвать конструктор, который принимаетколлекция предметов (например, LinkedList(listOf(one, two))).

0 голосов
/ 06 февраля 2019

Наиболее общим решением является вызов run, который не принимает параметров и приводит к значению, являющемуся результатом блока.С минимальными изменениями в вашем коде:

val DEFAULT_LIST = run {
    val it = ArrayList<MyObj>()
    val one = MyObj("one")
    val two = MyObj("two")
    it.add(one)
    it.add(two)
    it
}
0 голосов
/ 06 февраля 2019

Вы можете создать список с listOf или arrayListOf и параметрами:

val DEFAULT_LIST = listOf(MyObj("one"),MyObj("two"))

Или, если вам действительно нужно более сложное создание объекта, например, ArrayList, используйте функцию области действия apply или also для инициализации.Оба возвращают получатель (это), и вы можете назначить его переменной:

val DEFAULT_LIST = ArrayList<MyObj>().apply {
    val one = MyObj("one")
    val two = MyObj("two")
    one.complicatedProperty("complicated_property")
    two.complicatedProperty("complicated_property")


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