Предоставление значения по умолчанию для типов безопасных конфигураторов - PullRequest
0 голосов
/ 03 сентября 2018

Итак, в моем коде несколько раз встречаются похожие фрагменты:

val optionValue = try {
      Some(config.getString(key))
    } catch {
      case _: Missing => None
    }

Я хочу как-то устранить эти дубликаты из моего кода. Я знаю, что typesafe предоставляет способ предоставить резервный файл конфигурации для предоставления значений конфигурации по умолчанию. Однако в моем случае у меня нет значений по умолчанию для некоторых свойств. Это необязательные свойства.

Какой будет самый оптимальный способ рефакторинга этого кода.

Ответы [ 4 ]

0 голосов
/ 08 августа 2019

Исходя из ответа Джеко, я бы предпочел упростить код и избежать копирования и вставки метода hasPath для каждого типа.

  implicit class RichConfig(val config: Config) extends AnyVal {

    private def getOptional[T](path: String, get: String => T): Option[T] = {
      if (config.hasPath(path)) {
        Some(get(path))
      } else {
        None
      }
    }

    def optionalString(path: String): Option[String] = getOptional(path, config.getString)

    def optionalInt(path: String): Option[Int] = getOptional(path, config.getInt)

    def optionalDouble(path: String): Option[Double] = getOptional(path, config.getDouble)

    def optionalBoolean(path: String): Option[Boolean] = getOptional(path, config.getBoolean)

  }
0 голосов
/ 19 марта 2019

Это не так, как работает библиотека, согласно https://github.com/lightbend/config#how-to-handle-defaults.

Вы должны использовать withFallback метод для обеспечения чистой конфигурации.

0 голосов
/ 29 июля 2019

config.hasPath ('sample.property') сообщит вам, существует ли свойство.

0 голосов
/ 03 сентября 2018

Поскольку вы используете Scala и предполагаете, что у вас все в порядке с использованием имплицитов, я бы использовал рекомендованный подход с использованием класса обогащения, который позволяет вам сохранить синтаксис Option.

Пример конфигурации.

existent.sample.string="I exist!"
existent.sample.boolean=true

Пример класса обогащения.

package config

import com.typesafe.config.{Config, ConfigException}

object MyConfig {

  implicit class RichConfig(val config: Config) extends AnyVal {
    def optionalString(path: String): Option[String] = if (config.hasPath(path)) {
      Some(config.getString(path))
    } else {
      None
    }

    def optionalBoolean(path: String): Option[Boolean] = if (config.hasPath(path)) {
      Some(config.getBoolean(path))
    } else {
      None
    }

    // An example of using the exception approach - but less efficient than using hasPath
    def optionalString2(key: String): Option[String] = try {
      Some(config.getString(key))
    } catch {
      case _: ConfigException => None
    }

  }
}

Обратите внимание, что лучше использовать hasPath (вместо использования Try), чтобы проверить, существует ли ключ в вашем сценарии, вместо того, чтобы JVM создала исключение, которое не должно представлять интереса для необязательной конфигурации. который может не существовать.

Демо-версия.

import com.typesafe.config._

object ConfigTest extends App {

  import MyConfig._

  val conf = ConfigFactory.load

  val optionalString = conf.optionalString("existent.sample.string")
  val optionalStringNone = conf.optionalString("non-existent.sample.string")

  println(s"String config value: $optionalString")
  println(s"Optional (non-existent) String config value: $optionalStringNone")

  val optionalBoolean = conf.optionalBoolean("existent.sample.boolean")
  val optionalBooleanNone = conf.optionalBoolean("non-existent.sample.boolean")

  println(s"Boolean config value: $optionalBoolean")
  println(s"Optional (non-existent) String config value: $optionalBooleanNone")

}

печать.

// String config value: Some(I exist!)
// Optional (non-existent) String config value: None
// Boolean config value: Some(true)
// Optional (non-existent) String config value: None

Документы

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