Scala初始化一个不止一次调用的构造函数

时间:2014-12-25 19:35:21

标签: scala constructor initialization

我在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方法。我做错了什么?

1 个答案:

答案 0 :(得分:3)

def someClass = new SomeClass(a)

您的def定义了一种方法。调用方法会调用new SomeCLass(a)

for (i <- 1 to 3) {
  someClass.getData(i)
}

你的for循环调用someClass方法三次。每个调用都调用new SomeClass(a)。构造函数每次都调用initsomeClass然后返回新实例,并在其上调用getData

因此,调用getData并不会导致init被调用。它正在调用new SomeClass(a)

尝试

val someClass = new SomeClass(a) 

代替。这将调用new SomeClass(a)一次并将结果分配给someClass

此外,您发布的代码甚至无法编译(因为getData的正文不会返回正确的类型)

相关问题