2011-09-11 16 views
10

Ci sono alcuni file * .java nell'albero dei sorgenti di Scala nella directory scala.runtime.Qual è lo scopo di questi file Java in scala.runtime?

Questi file sembrano essere molto semplice, e. g. DoubleRef.java assomiglia a questo:

package scala.runtime; 

public class DoubleRef implements java.io.Serializable { 
    private static final long serialVersionUID = 8304402127373655534L; 

    public double elem; 
    public DoubleRef(double elem) { this.elem = elem; } 
    public String toString() { return java.lang.Double.toString(elem); } 
} 

C'è qualche motivo per cui queste classi non possono essere definiti a Scala?

+1

Solo un'ipotesi. Non esiste un costrutto di Scala che si compili in un campo statico privato, e forse questo è richiesto da java.io.Serializable per funzionare correttamente? –

+2

@Brian: useresti l'annotazione '@ SerialVersionUID' per quello. – soc

risposta

5

Solo un'ipotesi: non esiste un costrutto Scala che compili in un campo pubblico - pubblico var s in compilazione di Scala in un campo privato e un accesso pubblico e un mutatore. Poiché immagino che le classi *Ref siano ampiamente utilizzate, questa potrebbe essere un'ottimizzazione per evitare frequenti chiamate al metodo e sostituirle con l'accesso diretto al campo.

+0

Sembra plausibile, ma non dichiarare che quei metodi 'final' hanno lo stesso effetto lasciando che Java li ottimizzi? – Owen

+0

Non so - forse l'idea è di non richiedere a nessuno (compilatore o JVM) di fare qualche ottimizzazione qui ... –