首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局不可变缓存实例scala

全局不可变缓存实例scala
EN

Stack Overflow用户
提问于 2016-09-07 17:27:08
回答 1查看 281关注 0票数 0

我已经实现了基于twitter Storehaus Cache的不可变缓存。

以下是代码

接口

代码语言:javascript
复制
trait Cache[K, V] {
    def get(k: K): Option[V]

    def put(kv: (K, V)): (Set[K], Cache[K, V])

    def iterator: Iterator[(K, V)]
}

实现

代码语言:javascript
复制
object SenzCache {
    def empty[K, V]: SenzCache[K, V] = SenzCache[K, V](Map.empty[K, V])

    def apply[K, V](m: Map[K, V]): SenzCache[K, V] = new SenzCache[K, V](m)
}

class SenzCache[K, V](m: Map[K, V]) extends Cache[K, V] {

    override def get(k: K): Option[V] = {
        m.get(k)
    }

    override def put(kv: (K, V)): (Set[K], Cache[K, V]) = {
        (Set.empty[K], new SenzCache(m + kv))
    }

    override def iterator: Iterator[(K, V)] = m.iterator

    override def toString: String = m.toString()
}

我可以像下面这样使用这个缓存,

代码语言:javascript
复制
val c = SenzCache.empty[String, String]
val c1 = cache.put("era" -> "foo")._2
val c2 = c.put("ban" -> "bar")._2

println(c2.get("era"))

我想在我的应用程序中保留这个缓存的全局实例。如何做到这一点(如何在应用程序中全局保留此缓存的单个实例?每次put都会返回一个新的缓存)

EN

回答 1

Stack Overflow用户

发布于 2016-09-07 17:45:18

您可以限制对Cache构造函数的访问,并提供如下示例所示的lazy val instance = new CacheImpl

代码语言:javascript
复制
sealed trait Cache {
   // your cache methods
}

object Cache { 
  private lazy val instance: Cache = new CacheImpl 

  def apply(...) = instance

  private class CacheImpl(...) extends Cache { ... }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39366105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档