configuration.getString("value")
очень дешево. Конфигурация будет считываться и анализироваться один раз при запуске, а затем значения сохраняются в java Map
. Таким образом, в основном вызов getString
сводится к поиску в HashMap
. Это, конечно, дороже, чем общая переменная, но по-прежнему остается постоянной сложностью O (1). Это должно быть хорошо, особенно если вы звоните getString
только пару раз каждые 10 минут.
Реализация im, ссылаясь на то, что находится в sources of typesafe/config on GitHub. Строка 30 - это карта, в которой хранятся значения.
Update: Ваш вопрос пришел мне в голову сегодня утром, и он вдруг ударил меня, почему это плохая идея назвать getString
вместо инициализации разделяемой переменной со значением. Это не сразу пришло мне в голову, потому что это не имеет никакого отношения к производительности:
getString
имеет побочные эффекты, а именно, он может генерировать исключение, если значение конфигурации отсутствует, например, ваш файл конфигурации может быть поврежден. Поскольку обычно нет стратегии восстановления для такого исключения, было бы гораздо лучше использовать эти потенциальные сбои при запуске вместо пары десятков минут в программе, когда никто больше не смотрит.
В вашем вопросе вы использовали lazy val
как альтернативу, которая была бы подвержена той же самой проблеме, поскольку она была бы оценена только при необходимости. Поэтому, на мой взгляд, вы должны прочитать все значения конфигурации в val
s в начале программы!
private val inputPath = configuration.getString("main.directory")
Это делает, конечно, не применяется, если вы используете замещающего значения и 100% уверены, что не будет никаких исключений.
«Это должно быть хорошо, особенно если вы вызываете' getString' всего пару раз каждые 10 минут ». Я бы сказал: «Это должно быть хорошо, особенно если вы используете I/O для сканирования каталогов». – rightfold
Да, я получаю только путь к каталогу и заменяю часть, чтобы найти клиентский каталог. Это простая операция. – placplacboom
@ rightføld, вы абсолютно правы! –