【问题标题】:Scala: A setter on a singleton objectScala:单例对象的设置器
【发布时间】:2016-10-02 08:48:49
【问题描述】:

我的 Scala 应用程序(一个 Akka 服务)有一个 PersonBuilder

这个PersonBuilder 类有一个 REST 客户端,用于在构建实体之前检索一些数据。

任何时候我的应用程序中都应该只有一个实例这个PersonBuilder

显然,我可以在这里使用 PersonBuilder 对象,但问题是我想在运行单元测试时传入一个模拟 REST 客户端。

在 Scala 中对被认为是不好的做法的对象调用 setter 吗? 如果它安全完成并保证只发生一次,那么它肯定是一种可以采用的技术吗?

显然,也可以使用封装的 REST 客户端创建一个类,但问题是在没有依赖注入框架的情况下,我必须在我的代码周围传递这个 PersonBuilder 类。

目前在 Scala 中是否有任何关于此的约定?

【问题讨论】:

    标签: scala


    【解决方案1】:
    class PersonBuilder(rest: Rest)
    object PersonBuilder extends PersonBuilder(LiveRest)
    object TestPersonBuilder extends PersonBuilder(MockRest)
    

    如果您不想要构造函数参数,请使用特征。

    trait PersonBuilder {
      def rest: Rest
    }
    object PersonBuilder extends PersonBuilder {
      override val rest = LiveRest
    }
    

    【讨论】:

    • 非常有趣的方法,我不知道你能做到这一点
    • 感兴趣的是,您对 Object setter 方法有何看法?
    • @DJ180 如果您使用的是二传手,请彻底洗手,以免代码的气味渗入您的手指或袖子,用大量水冲洗,然后回到键盘上并更换上述任何一种模式。 :)
    • :-) 是的,我同意,只是感觉不对,因此是我最初的问题。我想我最初的两个担忧是(1)设置器打开对象以防止误用、竞争条件等(2)可读性
    • 我不确定这个解决方案是否能解决我的问题。我仍然必须在所有使用它的类中传递对 PersonBuilder 的引用。我想我需要为我的 Akka 服务找到一个可靠的依赖注入框架
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多