2

我将如何访问 Scala 中现有的变量数据。我举个例子:

类存储:有一个地图(和我使用的其他数据)

A类:

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

B类:

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

结果是:

A: value

B: null

我想让 B 类也打印“值”,即使存储类中的内容对于所有访问它们的类都相同。

传递 storeManager 变量是唯一的方法吗?因为我希望避免这种情况

4

2 回答 2

3

你真的应该传递变量。从长远来看,它使代码易于维护,因为这两个类明确使用相同的存储管理器(如果您愿意,可以更改它)。

但是,如果您想使用共享存储,只需在单例对象中创建一个并引用它。

object StorageForAB {
  val storageManager = new storage
}

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

(我已更改val为,def因为没有理由复制变量 - 只需参考通用副本。)

请注意,这将阻止storageManager. 还要注意,这将在 和 的所有实例中共享相同的storageManager内容。如果您不希望这样,我不确定如果您不这样说(例如通过传递相同的) ,您如何期望任何给定与适当的配对。ABABstorage

于 2013-05-25T21:43:01.857 回答
2

一个更灵活的解决方案(如果您需要它)如下:

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

这将允许您基于标识符创建存储类,然后随意重用它们。例如,在您的 A 类和 B 类中,new storage();您不会这样做:

val storageManager = StorageManager("SharedClassAB");

StorageManager使用相同的键值调用的 apply 方法总是会产生相同的Storage实例,如果它还不存在,则会创建该实例。


我不确定这是否真的是你可能需要的东西,但因为这是我想到的第一件事,所以我已经发布了它。如果您不需要那种级别的灵活性,您可能应该使用@RexKerr 的解决方案:)

于 2013-05-25T22:22:44.703 回答