如何在scala

时间:2016-07-14 04:05:50

标签: scala

ScalaStyle不允许使用可变变量。示例代码:

object Configuration {

  var auroaDbConfig: AuroraConnectionParameter = null
  def getConfigration() = {
    val rootConfig: Config = ConfigFactory.load()
    //for aurora configuration
    auroaDbConfig = rootConfig
      .as[AuroraConnectionParameter]("mdpApp.aurora")
    //for spark configuration
    val sparkConfig: SparkConnectionParameter = rootConfig
      .as[SparkConnectionParameter]("mdpApp.spark")
    //for cassandra configuration
    val cassandraDbConfig: CassandraConnectionParameter = rootConfig
      .as[CassandraConnectionParameter]("mdpApp.cassandra")
    //for s3 configuration
    val s3Config: S3ConnectionParameter = rootConfig
      .as[S3ConnectionParameter]("mdpApp.s3")

  }

}

用例:ConfigFactory.load()只能被调用一次 所以将它放入一个函数中,该函数将在代码和代码中被调用一次。根据代码中的要求调用其他变量

如何重构代码,以便在函数中初始化变量并在代码中何时何地调用

2 个答案:

答案 0 :(得分:2)

关键字lazy完全适合这种情况。我们想加载一次,但只在我们需要它时加载。

此示例中没有关键字lazy也可以。

object Configuration {

  lazy val rootConfig: Config = ConfigFactory.load()
  lazy val auroaDbConfig: AuroraConnectionParameter = rootConfig
      .as[AuroraConnectionParameter]("mdpApp.aurora")
  lazy val sparkConfig: SparkConnectionParameter = rootConfig
      .as[SparkConnectionParameter]("mdpApp.spark")
    //for cassandra configuration
  lazy val cassandraDbConfig: CassandraConnectionParameter = rootConfig
      .as[CassandraConnectionParameter]("mdpApp.cassandra")
    //for s3 configuration
  lazy val s3Config: S3ConnectionParameter = rootConfig
      .as[S3ConnectionParameter]("mdpApp.s3")

}

答案 1 :(得分:0)

  def getConfigration() : AuroraConnectionParameter = {
    val result = rootConfig
      .as[AuroraConnectionParameter]("mdpApp.aurora")
    // snip
    result
  }
  val auroaDbConfig = getConfiguration()

如果我理解你的问题,我相信会做你所要求的。当然,您也可以将rootConfig.as[AuroraConnectionParameter]...作为函数中的最后一个语句执行,它的行为与捕获变量并返回它的行为相同。适合您的风格和其他限制因素。