【问题标题】:Pureconfig Typesafe Config with sealed abstract case class带有密封抽象案例类的 Pureconfig Typesafe Config
【发布时间】:2018-01-10 23:28:52
【问题描述】:

我正在尝试将 Pureconfig 合并到我的用例中以进行类型安全配置。成功地将 HOCON .conf 映射到案例类类型。但是,如果我必须在对象定义方面限制我的类型而没有副作用(即,抑制默认的 apply() 和 copy()),我将使用以下案例类的定义方法:

sealed abstract case class someConfig(name:String)

object someConfig{
    def apply(name:String):Option[someConfig]={
        if(Option(name).isDefined && name.nonEmpty){
            Some(new someConfig(name){})
        } else {
            None
        }
    }
}

为了支持 Option[_] 类型,我正在考虑使用隐式 ConfigReader。这种方法似乎行得通,我需要更多的时间来处理对象映射和实例化的配置键。

到目前为止,我搜索过的示例似乎并没有引起这种需求的共鸣。但是,请务必在对象成员上使用 Option[_]。尝试浏览 Pureconfig git repo 中的代码示例。

有人可以建议一种可以支持 Option[T] 的方法,其中 T 是复合自定义类型吗?而且我不必处理成员变量名称来配置键映射等,即避免必要的样板!

【问题讨论】:

    标签: class case abstract sealed pureconfig


    【解决方案1】:

    因为您隐藏了类的构造函数以便通过apply 进行通道验证,所以您必须手动构造ConfigReader。我相信这就像把它放在你的伴生对象中一样简单:

    implicit val configReader = 
      pureconfig.ConfigReader.fromNonEmptyStringOpt[someConfig](apply)
    

    或者,您可以命名实现抽象类型的类,在这种情况下,PureConfig's automatic derivation for sealed families 会神奇地为您创建 ConfigReader

    【讨论】:

    • 将此标记为已关闭。替代方法(与上述自动推导链接一致......)确实有效。除了能够在配置之间自动神奇地映射到所需的 ADT 之外,这满足了我抑制默认 apply() 和 copy() 的需要。为了可扩展性,还可以有一个抽象类扩展特征,以便能够概括序列化要求(覆盖 def toString())。
    • 进一步,解决方法是让case class 带有一个与我需要允许的唯一构造函数匹配的 copy(...) 方法。这解决了抑制默认 apply() 和 copy() 方法的问题。作为改进,我可以定义一个可应用于 ADT 的宏以包含匹配的 copy(...) 方法。我试过的 Scala 版本 - 2.12.3
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2017-03-13
    • 2013-10-24
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多