2014-12-25 5 views
0

У меня есть простой класс в Scala. Я хочу инициализировать некоторые данные при создании класса. Это мой код: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".

По какой-то причине метод Init вызывается каждый раз, когда я вызываю метод getData. Что я делаю не так?

+2

«метод Init дозвонились каждый раз, когда я вызываю метод„GetData“.» Нет, нет. Или, если вы думаете иначе, напишите полный код, который показывает, что он делает. –

+0

Да, да. Я обновился, чтобы показать код. – bashan

+0

Нет, это не так. См. Мой ответ. –

ответ

3
def someClass = new SomeClass(a) 

Ваш def определяет метод. Вызов метода вызывает new SomeCLass(a).

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

Ваш цикл вызывает метод someClass три раза. Каждый из этих вызовов вызывает new SomeClass(a). Конструктор вызывает init каждый раз. someClass затем возвращает новый экземпляр, и на это вызывается getData.

Таким образом, он не звонит getData, который вызывает вызов init. Он звонит new SomeClass(a)

Попробуйте

вместо этого. Это вызовет new SomeClass(a) один раз и присвоит результат someClass.

Кроме того, ваш код размещен не даже компиляции (потому что тело GetData в не возвращает правильный тип)

+0

Спасибо и извините за беспокойство. Все еще в процессе обучения ... :) – bashan

+0

Стоит остановиться, чтобы думать, когда происходит невозможное, чтобы увидеть, что еще может произойти :) Если похоже, что конструктор получает вызов несколько раз, возможно, конструктор вызывается несколько раз: -P –

+0

Вы абсолютно правы :) – bashan

Смежные вопросы