如何访问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类打印“value”,即使存储类中的内容对于访问它们的所有类都是相同的。
传递storeManager变量的唯一方法是什么?正如我希望避免的那样
答案 0 :(得分:2)
你真的应该传递变量。从长远来看,它使很多更易于维护的代码,因为这两个类使用相同的存储管理器是明确的(如果你愿意,可以让你改变它)。
但是如果你想使用共享存储,只需在单个对象中创建一个并引用它。
object StorageForAB {
val storageManager = new storage
}
class A {
def storageManager = StorageForAB.storageManager
}
class B {
def storageManager2 = StorageForAB.storageManager
}
(我已将val
更改为def
,因为没有理由复制变量 - 只需参考公共副本。)
请注意,这样可以防止storageManager
的垃圾回收。另请注意,这将在storageManager
和A
的所有实例中共享相同的B
。如果您不想这样,我不确定您是否希望任何给定的A
与适当的B
配对,如果您不这样说(例如通过传递相同的storage
{{1}} 1}})。
答案 1 :(得分: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的解决方案:)