gpt4 book ai didi

scala - 在 Scala 中实现 findOrCreate 池的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-04 02:37:45 25 4
gpt4 key购买 nike

我想创建一个某种类型的对象池,比方说Person,实现如下:

class Person(val name: String, val email: String) { 
val data = expensiveComputation(name, email)
}

并有一个如下所示的查找方法:

def findOrCreate(name: String, email: String): Person

此方法应该具有这样的属性,即它总是针对给定的一组参数返回相同的对象给 findOrCreate,如果它不存在则创建它。此外,我希望这些对象具有廉价的相等性测试和散列。

初始化这些对象时,需要进行一些昂贵的计算,所以我真的想避免将一个对象实例化两次。此外,如果我没有查找工具,域(实际上是生物信息学中的序列处理)会让我将每个对象实例化 10-100 次,因此内存成本是另一个令人信服的原因。

我想到的最好的方法是创建一个可变的 HashMap(以避免 GC 开销,因为我将创建大量对象),它将参数映射到 Person 实例,并检查每次调用时都存在于 map 中。此外,我将通过调用 eq 覆盖 equals,并将 hashCode 保留为默认的 AnyRef.hashCode 实现。

有没有更好的方法来实现这个模式?

最佳答案

我认为你应该只写你的类

case class Person(name: String, email: String)

您可以免费获得平等和散列,因为它是一个案例类。

我认为您真的不需要为此维护 HashMap。处理 HashMap、更新它、确保它是线程安全的并且始终处于一致状态、回收未使用的实例等的开销对于具有两个字符串参数的案例类来说可能不值得。

问题编辑后编辑:使用案例类没有坏处,你再次免费获得 equalshashCode,但如果你最终使用 Map [(String, String), Person] 你真的不需要它,因为你有一个字符串元组作为键。使用 HashMap 很好,但正如我之前提到的:确保你的代码是线程安全的(除非让 thread1 和 thread2 创建 Person("bla", "bla") 不是问题),你仍然会得到只有一个实例存储在 Map 中),您可能还应该处理过期以避免可能的内存泄漏。我会探索一个真正的缓存解决方案,例如 Guava 库(或某些 scala 等效项)中提供的解决方案。

关于scala - 在 Scala 中实现 findOrCreate 池的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com