2013-01-14 4 views
6

mi stava guardando il sorgente del file RedBlackTree ed io siamo capitati la definizione per Tree, la parte rilevante di cui ho copiato qui:Scala RedBlackTree sintassi

sealed abstract class Tree[A, +B](
@(inline @getter) final val key: A, 
@(inline @getter) final val value: B, 
@(inline @getter) final val left: Tree[A, B], 
@(inline @getter) final val right: Tree[A, B]) 

Ho 2 domande:

  1. Come si confronta @(inline @getter) con @inline @getter?
  2. Perché i numeri val sono qualificati con final? (Non final è ridondante in questo contesto?)

risposta

8

La sintassi @(inline @getter) è un esempio di un meta annotazione, che dice al compilatore che l'annotazione @inline deve essere collocato sul metodo getter generato (in contrapposizione al constructer parametro, che sarebbe l'impostazione predefinita qui): meta annotations

Il final contrassegna il campo generato e il getter come finale, quindi non possono essere sovrascritti da sottoclassi.

Questa particolare combinazione è stata utilizzata qui per ingannare il compilatore Scala per accedere direttamente ai campi delle istanze Tree, anziché chiamare i getter e fare affidamento sull'ottimizzatore JVM per eseguire correttamente l'inlining. Purtroppo Scala non fornisce un modo ufficialmente supportato per utilizzare direttamente i campi.

Quando l'albero redblack è stato ottimizzato per Scala 2.10, questo ha dato le migliori prestazioni. Vedi l'immutabile TreeMap/TreeSet pull request per i dettagli sanguinosi.

+0

Avevo già letto alcune delle richieste di pull, ma non ho mai notato quanto sopra prima, grazie per essere saltato fuori per spiegarlo! –