0

내가 구현 한 불변의 캐시 트위터 Storehaus Cache글로벌 불변의 캐시 인스턴스 스칼라

다음에 따라 코드

인터페이스입니다

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")) 

이 캐시의 전역 인스턴스를 내 응용 프로그램에 유지하고 싶습니다. 어떻게 할 수 있습니까? (앱에서이 캐시의 단일 인스턴스를 전체적으로 유지하는 방법, 모든 put은 새 캐시를 반환합니다)

답변

0

Cache 생성자에 대한 액세스를 제한하고 다음 예제와 같이 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

문제는'대신, 내가 응용 프로그램에서이 문제를 처리 할 수있는 방법, 나는'VAR 캐시 = SenzCache.empty [문자열, 문자열]을 사용할 수있는 모든 새로운 SenzCache 반환 '넣어'캐시에 접근하지입니다 발,하지만 다른 대안이 있습니다. – eranga

관련 문제