scala - 延迟加载一些配置参数,试图在 Scala 中提出一个模式

标签 scala

我希望我的客户端代码看起来像这样:

    val config:Config = new MyConfig("c:/etc/myConfig.txt")
    println(config.param1)
    println(config.param2)        
    println(config.param3)

意思就是:
  • Config 接口(interface)定义了配置字段
  • MyConfig 是一个 Config 实现——所有需要的连接都是所需实现的实例化
  • 数据是延迟加载的——它应该发生在第一个字段引用(本例中为 config.param1)

  • 所以,我希望客户端代码友好,支持可互换的实现,具有静态类型的字段,隐藏延迟加载。我还希望它尽可能简单地进行替代实现,因此 Config 应该在一定程度上指导您。

    到目前为止,我对我的想法并不满意:
    trait Config {
      lazy val param1:String = resolveParam1
      lazy val param2:String = resolveParam2
      lazy val param3:Int = resolveParam3
    
      protected def resolveParam1:String
      protected def resolveParam2:String
      protected def resolveParam3:Int
    }
    
    class MyConfig(fileName:String) extends Config {
      lazy val data:Map[String, Any] = readConfig
    
      // some dummy impl here, should read from a file
      protected def readConfig:Map[String,Any] = Map[String, Any]("p1" -> "abc", "p2" -> "defgh", "p3" -> 43)
    
      protected def resolveParam1:String = data.get("p1").get.asInstanceOf[String]
      protected def resolveParam2:String = data.get("p2").get.asInstanceOf[String]
      protected def resolveParam3:Int = data.get("p3").get.asInstanceOf[Int]
    }
    

    我确信有更好的解决方案,这就是您可以提供帮助的地方:)

    我特别不喜欢这里的一件事是 MyConfig 定义了一个带有一些任意键的中间容器,因为它是 Map[String, 任意 ],我需要转换值。

    最佳答案

    没有什么可以阻止您将值抽象化。您不能在 super 特征中强制执行惰性,但这没关系,因为无论如何延迟加载实际上是一个实现细节:

    trait Config {
      val param1: String
      val param2: String
      val param3: Int
    }
    
    class MyConfig extends Config {
      lazy val param1 = readConfig().("p1")
      ...
    
      def readConfig(): Map[String, String] = ...
    }
    

    在风格上,readConfig()应该用括号(而不是不带)声明和调用,因为它是一种副作用方法。无括号语法旨在表示纯函数方法。

    关于scala - 延迟加载一些配置参数,试图在 Scala 中提出一个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/345788/

    相关文章:

    scala - 在 Spark sql 数据帧(UDAF)上的自定义案例类上实现总和聚合器

    scala - 组合两个def后展平类型

    scala - Gradle Kotlin DSL Scala和想法

    scala - Scala self 类型可以强制执行案例类类型吗

    java - 甚至无法在 Windows 上运行简单的 Spark 计数

    oop - Scala 类继承

    regex - 避免在 ScalaTest 中针对正则表达式的 matchPattern 上的弃用警告

    scala - 在 Scala 中表达有状态过滤器的功能方法

    algorithm - Scala:测试阵列中等间隔频率的惯用方法是什么?

    scala - Scala中的代字号运算符