Как я все еще могу выполнить тело кода суперкласса в одноэлементном объекте в Scala - PullRequest
0 голосов
/ 22 января 2019

Я думаю, что приведенный ниже код лучше всего описывает мою проблему:

import scala.collection.mutable.Set

case class CrazyClass(i: Int) {

  override def toString: String = s"CrazyClass[ i=$i ]"

  CrazyClass.registeredClasses += this

}

object CrazyClass extends App{
  val registeredClasses = Set[CrazyClass]()

  CrazyClass(1); CrazyClass(2)

  registeredClasses.foreach(println(_))
}

Это печатает, как и ожидалось:

    CrazyClass[ i=2 ]
    CrazyClass[ i=1 ]

Но если я попробую это с объектом, который простирается от CrazyClass, объект не регистрируется автоматически:

object CrazyExtendedObject extends CrazyClass(4) {
  def something = 2
}

Вывод с добавленным кодом все тот же, что и выше.Если я добавлю нормальный расширенный класс следующим образом, все будет работать правильно:

class CrazyExtendedClass(i: Int) extends CrazyClass(i)

Каждый экземпляр нового класса будет зарегистрирован.

Так, как я могу достичь того же результата на объекте?

1 Ответ

0 голосов
/ 22 января 2019

Просто ссылка CrazyExtendedClass от вашего App.

Синглтоны загружаются лениво, поэтому инициализатор не запустится, пока вы не попросите об этом.

...