Во-первых, я бы отделил код, который читает конфигурацию, от кода, который обрабатывает результаты.В этом случае значение по умолчанию "output"
встраивается в код, который читает конфигурацию, когда это, вероятно, должно быть выполнено в отдельном проходе.
Во-вторых, я бы использовал пакет для автоматического заполнения case class
иззапись конфигурации.Затем вам потребуется одна строка для каждого объекта конфигурации, и вы получите результаты, проверенные для вас.Например,
object BeamConfig {
val warmStart = Config[WarmStart]("warmStart")
val config2 = Config[Config2]("config2")
...
}
Если вам нужна некоторая обработка, вы можете сделать это
val warmStart = ProcessWarmStart(Config[WarmStart]("warmStart"))
Этот подход все еще требует небольшого количества кода котельной пластины, но он обеспечивает лучшую безопасность типов, чем массовый импортКонфигурация.
Я бы также рассмотрел возможность объединения объектов в меньшее количество вложенных объектов с соответствующими вложенными классами.
Вот урезанная версия Config
с использованием json4s
и jackson
:
import com.typesafe.config._
import org.json4s._
import org.json4s.jackson.JsonMethods._
object Config {
private val cfgFile = "configFile"
private val conf = ConfigFactory.load(cfgFile).withFallback(ConfigFactory.load())
private val jData = parse(conf.root.render(ConfigRenderOptions.concise))
def apply[T](name: String)(implicit formats: Formats = DefaultFormats, mf: Manifest[T]): T =
Extraction.extract(jData \\ name)(formats, mf)
}
Это вызовет исключение, если конкретный объект конфигурации не существует или не соответствует формату класса T
.