Tutto lo scala stile dichiarativo è solo un'illusione. Scala è costruito su una jvm e funziona come java.
Evetything è una classe e deve essere indipendente dal suo utilizzo (java non è C++ e supporta la build incrementale con i suoi pro e contro). Ogni tratto ha il proprio codice di inizializzazione e la classe multi-traccia esegue il rispettivo codice di inizializzazione uno per uno. Se si utilizza un AnyRef dichiarato solo in una sottoclasse di quella il suo valore verrà impostato per null durante l'inizializzazione.
Mi guardo con regole di convenzione specifiche: ogni valore deve essere finale o pigro (why using plain val in non-final classes). Quindi non mi interessa l'ordine di inizializzazione e posso fingere che sto usando un linguaggio dichiarativo.
Inoltre sto usando l'opzione -Xcheckinit
: aggiungi il controllo di runtime agli accessori di campo.
è possibile definire u come 'lazy val' –