如何在 Scala 中检测初始化结束

How to detect end of initialization in Scala

提问人:Simon Guilloud 提问时间:11/12/2023 最后编辑:stefanobaghinoSimon Guilloud 更新时间:11/13/2023 访问量:58

问:

我有以下父例(简体) 我写了一个特征“图书馆”作为书籍收藏的模板:

trait Library {
  export Library.*
  private val catalogue = mutable.Map["String", Book] = mutable.Map()

  def writeBook(name:String, content: () => String) : Book = {
    // check if books can be recovered from serialization...
    val newBook = Book(name, content())
    catalogue(name) = newBook
    newBook
  }

  // When initialization is finished
  serialize(catalogue)



}
object Library {
  class Book(name:String, content: String) {
    ...
  }

我跳过了有关如何在 中使用序列化的详细信息。 然后,用户可以执行以下操作:writeBook


object MyLibrary extends Library {

  val aliceInWonderland = newBook("Alice In Wonderland", ???)

  val warAndPeace= newBook("War and Peace", ???)
}

重要的部分是,计算书籍内容可能非常昂贵,因此可以在运行之间缓存。此外,为了提高效率,重要的是一次性缓存,而不是为每本书单独缓存。catalogue

我现在有两个问题:

  • 我怎样才能在好时机为用户透明地运行我的函数,而不使用已弃用的?serializedelayedInit
  • 假设我在 中有一个 main 方法,以便用户可以运行他们的每个 MyLibrary 对象,执行任何操作。如何将参数从命令行传递到初始值设定项以激活或停用序列化?library

我整天都在思考这个问题,但找不到一种解决方法,可以使每个 MyLibrary 对象都没有任何与书籍无关的内容(这很重要)。知道什么是适合弃用的解决方法吗?delayedInit

Scala 初始化

评论

1赞 Luis Miguel Mejía Suárez 11/13/2023
就个人而言,而不是整个可变和神奇的方法。只需在构造函数中创建一个接收 a 的函数即可。Libraryfinal classList[BookInfo]
0赞 Simon Guilloud 11/13/2023
这将破坏许多依赖于扩展 Library 类的功能,除其他外,该类可以提供一个大的 DSL(就像在我的实际应用程序中一样)和一个允许运行 MyLibrary 对象的 main 函数。更一般地说,这是对代码库的彻底更改,会带来很多后果,而不是真正解决所显示的问题。
0赞 Mateusz Kubuszok 11/13/2023
它们使 Book 构造函数私有化或包私有化,并且需要通过一些 API 获取 book,这将创建新的并将其放入缓存中或从那里获取它。然后,只有在请求才创建书籍。
1赞 Mateusz Kubuszok 11/13/2023
如果任何人都可以在任意时刻创建一个新实例,你就无法想出任何防弹方法来确保可以形成用于任何目的(例如序列化)的有效批处理。充其量,你的逻辑听起来像是代码应该承认有状态性,通过一些服务获取东西,让这个服务负责创建实例并缓存它们,就好像它们是从数据库或外部服务中获取的一样,也许把它们放在某个队列中(形成所有东西的批次,例如最后 10 秒),并定期刷新缓存以防止 OOM。在构造函数中这样做听起来像是滥用
1赞 stefanobaghino 11/13/2023
您是否需要保持客户端代码完全不变,或者您有一些回旋余地?

答: 暂无答案