Classes and objects (but note, not traits) inheriting theDelayedInit marker trait will have their initialization code rewritten as follows:code becomesdelayedInit(code).
Initialization code comprises all statements and all value definitions that are executed during initialization.
Example:
trait Helper extends DelayedInit { def delayedInit(body: => Unit) = { println("dummy text, printed before initialization of C") body // evaluates the initialization code of C }}class C extends Helper { println("this is the initialization code of C")}object Test extends App { val c = new C}Should result in the following being printed:
dummy text, printed before initialization of Cthis is the initialization code of C"Delayed Initialization" subsection of the Scala Language Specification (section 5.1)
[Since version 2.11.0]DelayedInit semantics can be surprising. Support for `App` will continue. See the release notes for more details: https://github.com/scala/scala/releases/tag/v2.11.0