scala中可变变量的处理

scala中可变变量的处理,scala,Scala,ScalaStyle不允许可变变量。示例代码: object Configuration { var auroaDbConfig: AuroraConnectionParameter = null def getConfigration() = { val rootConfig: Config = ConfigFactory.load() //for aurora configuration auroaDbConfig = rootConfig .a

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()
因此,将其放入一个函数中,该函数将在代码中调用一次&其他变量将根据代码中的要求进行调用

  def getConfigration() : AuroraConnectionParameter = {
    val result = rootConfig
      .as[AuroraConnectionParameter]("mdpApp.aurora")
    // snip
    result
  }
  val auroaDbConfig = getConfiguration()
如何重构代码,以便在函数中初始化变量,并在代码中需要的时间和地点调用变量

  def getConfigration() : AuroraConnectionParameter = {
    val result = rootConfig
      .as[AuroraConnectionParameter]("mdpApp.aurora")
    // snip
    result
  }
  val auroaDbConfig = getConfiguration()
如果我正确理解你的问题,我相信我会按照你的要求去做。当然,您也可以将
rootConfig.as[AuroraConnectionParameter]…
作为函数中的最后一条语句执行,它的行为与捕获变量并返回变量相同。符合您的风格和其他约束条件的


如果我正确理解你的问题,我相信我会按照你的要求去做。当然,您也可以将
rootConfig.as[AuroraConnectionParameter]…
作为函数中的最后一条语句执行,它的行为与捕获变量并返回变量相同。无论哪一个符合您的风格和其他限制条件。

关键字
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")

}

关键词
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")

}

但这不仅仅是一个变量,我有4个相似的变量。我必须确保rootconfig只声明一次。但这不仅仅是一个变量,我有4个相似的变量。我必须确保rootconfig只声明一次