Большой список литералов в Kotlin компиляторе - PullRequest
1 голос
/ 30 марта 2020

Я использую val globalList = listOf("a1" to "b1", "a2" to "b2"), чтобы создать большой список пар строк. Все в порядке, пока вы не попытаетесь поместить более 1000 пар в список. Компилятор либо занимает> 5 минут, либо просто падает (как в IntelliJ, так и в Android Studio). То же самое происходит, если вы используете простые списки строк вместо пар.

Есть ли лучший способ / лучший способ включить большие списки в исходный код без обращения к базе данных?

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Вы можете заменить выражение listOf(...) списком, созданным с помощью конструктора или фабричной функции и добавив в него элементы:

val globalList: List<Pair<String, String>> = mutableListOf().apply {
    add("a1" to "b1")
    add("a2" to "b2")
    // ...
}

Это определенно более простая конструкция для анализа компилятором.

0 голосов
/ 30 марта 2020

Нет хорошего способа сделать то, что вы хотите; для чего-то такого размера чтение значений из файла данных (или вычисление их, если это было возможно) - намного лучшее решение в целом - более удобное в обслуживании, намного быстрее компилировать и запускать, легче читать и редактировать, с меньшей вероятностью вызывает проблема с инструментами сборки и фреймворками…

Если вы позволите компилятору завершить sh, его вывод сообщит вам о проблеме. (' Всегда читать сообщения об ошибках ' должно быть одним из кардинальных правил разработки!)

Я попробовал версию горячей клавиши, используя apply(), и в конечном итоге это выдало эту ошибку:

… Caused by: org.jetbrains.org.objectweb.asm.MethodTooLargeException: Method too large: TestKt.main ()V …

Есть проблема: MethodTooLargeException . JVM допускает только 65535 байтов байтового кода в одном методе; см. этот ответ . Это предел, с которым вы сталкиваетесь: если у вас слишком много записей, его код превысит этот предел, и поэтому его нельзя будет скомпилировать.

Если бы вы были настоящим мазохистом, вы, вероятно, могли бы Обойти это до некоторой степени, разделив инициализацию между многими методами, сохраняя код каждого из них как раз под пределом. Но, пожалуйста, не надо! Ради ваших коллег, ради вашего компилятора и ради вашего собственного психического здоровья ...

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