0

我已经实现了一成不变的缓存是代码全球一成不变的缓存实例斯卡拉

接口

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)] 
} 

实施

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() 
} 

我可以使用此缓存如下所示,

val c = SenzCache.empty[String, String] 
val c1 = cache.put("era" -> "foo")._2 
val c2 = c.put("ban" -> "bar")._2 

println(c2.get("era")) 

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

回答

0

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

sealed trait Cache { 
    // your cache methods 
} 

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

    def apply(...) = instance 

    private class CacheImpl(...) extends Cache { ... } 
} 
+0

问题是不是访问缓存,每一个“放”返回一个新SenzCache,我怎么能在应用程序中处理这个问题,我可以用'VAR缓存= SenzCache.empty [字符串,字符串]',而不是val,但有没有其他方法。 – eranga