我在Scala中有一个简单的类。我想在创建类时初始化一些数据。这是我的代码:
class SomeClass(someSeq: Seq[Int]) {
val someMap = scala.collection.mutable.Map.empty[Int, Set[String]]
init()
def init(): Unit = {
println("init")
}
override def getData(aValue: Int): Set[String] = {
println("I was called")
}
}
运行它的代码:
def someClass = new SomeClass(a)
for (i <- 1 to 3) {
someClass.getData(i)
}
这是输出:
init
init
I was called
init
I was called
init
I was called
“Init”中的代码初始化“someMap”。
由于某种原因,每次调用方法“getData”时都会调用Init方法。我做错了什么?
答案 0 :(得分:3)
def someClass = new SomeClass(a)
您的def
定义了一种方法。调用方法会调用new SomeCLass(a)
。
for (i <- 1 to 3) {
someClass.getData(i)
}
你的for循环调用someClass
方法三次。每个调用都调用new SomeClass(a)
。构造函数每次都调用init
。 someClass
然后返回新实例,并在其上调用getData
。
因此,调用getData
并不会导致init
被调用。它正在调用new SomeClass(a)
尝试
val someClass = new SomeClass(a)
代替。这将调用new SomeClass(a)
一次并将结果分配给someClass
。
此外,您发布的代码甚至无法编译(因为getData的正文不会返回正确的类型)