2013-05-25 5 views
2

Scala에서 기존 변수 데이터에 액세스하는 방법은 무엇입니까? 급 스토리지 : 나는 예를주지Scala의 다른 클래스에서 변수에 액세스

val storageManager = new storage(); 
storageManager.putValue("key","value"); 
println("A: " + storageManager.getValue("key")); 

클래스 B에서 :

val storageManager2 = new storage(); 
println("B: " + storageManager2.getValue("key")); 

결과는 클래스 A에서지도 (내가 사용하는 다른 데이터)

을 가지고 :

A : 값

B : NULL

클래스 B에 "value"를 인쇄하고 저장소 클래스의 내용을 액세스하는 모든 클래스에 동일하게 지정하고 싶습니다. storeManager 변수를 유일한 방법으로 전달하고 있으므로이를 피하고자합니다.

답변

2

정말 변수를 전달해야합니다. 에 대한 코드는입니다.이 두 클래스가 동일한 저장소 관리자를 사용하고 있으므로 원하는대로 변경할 수 있습니다.

공유 저장소를 사용하려면 싱글 톤 개체에서 하나를 만들고 참조하십시오.

object StorageForAB { 
    val storageManager = new storage 
} 

class A { 
    def storageManager = StorageForAB.storageManager 
} 
class B { 
    def storageManager2 = StorageForAB.storageManager 
} 

는 (변수를 복사 할 이유가 없기 때문에 나는 defval을 변경 한 -. 단지 일반적인 사본 참조)이이 storageManager의 가비지 수집을 방지 할 수 있음을

참고. 또한 AB의 모든 인스턴스에서 동일한 storageManager을 공유합니다. 원하지 않으실 경우, A이 적절하지 않은 경우 (예 : 동일한 storage을 전달하여) B과 페어링되는 것을 어떻게 기대하는지 잘 모르겠습니다. 이것은 당신이 다음 식별자를 기반으로 스토리지 클래스를 생성하고, 할 수 있도록 할

class Storage(key:String) // Just to make the code work, this could be anything 

object StorageManager { 
    private val instances = scala.collection.mutable.Map[String, Storage]() 

    def apply(key:String) = instances.get(key) match { 
     case Some(x) => x 
     case _ => 
      val instance = new Storage(key) 
      instances.put(key, instance) 
      instance 
    } 
} 

재사용 :

+0

고마워요. 그것은 내가 원하는 것입니다. – Tsume

1
, 다음 (당신이 그것을 필요로하는 경우는) 좀 더 유연한 솔루션입니다

그들을 의지대로. 예를 들어, 클래스 A와 B에, 대신 new storage();의 당신이 할 것 :

val storageManager = StorageManager("SharedClassAB"); 

StorageManager 년대가 같은 키 - 값은 항상 경우에 생성됩니다 같은 Storage 인스턴스를, 산출과 방법을 적용 호출 그것은 아직 존재하지 않습니다.


이것이 실제로 필요한 항목인지는 확실하지 않지만 마음에 들었던 첫 번째 항목이므로 게시했습니다. 당신이 그 정도의 유연성을 필요로하지 않는다면 아마도 @ RexKerr의 해결책을 따라 가야 할 것입니다. :)

+0

감사합니다. 미래에 이것을 명심하십시오. – Tsume

관련 문제