从Scala中的另一个类访问变量

时间:2013-05-25 21:21:56

标签: scala

如何访问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变量的唯一方法是什么?正如我希望避免的那样

2 个答案:

答案 0 :(得分:2)

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

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

object StorageForAB {
  val storageManager = new storage
}

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

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

请注意,这样可以防止storageManager的垃圾回收。另请注意,这将在storageManagerA的所有实例中共享相同的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的解决方案:)