Ho rintracciato la modifica al revision 318617 in the Apache Xerces SVN Repository (questo è il progetto in cui questo parser XML è stato inizialmente sviluppato, come suggerisce il nome del pacchetto).
La parte rilevante del messaggio di commit è:
Cercando di migliorare l'utilizzo delle tabelle dei simboli. Molte stringhe predefinite sono aggiunte alle tabelle dei simboli ogni volta che il parser viene ripristinato. Per i documenti di piccole dimensioni, questo sarebbe un costo significativo. Da quando chiamiamo String # intern per Stringhe nella tabella dei simboli, è sufficiente utilizzare String # intern per i simboli predefiniti . Questo deve essere eseguito solo una volta.
Come è stato notato, lo .intern()
non dovrebbe essere necessario (e non dovrebbe avere alcun effetto visibile) su un'implementazione JVM conforme.
La mia ipotesi è che
- sia l'autore non era a conoscenza del fatto che stringhe letterali saranno sempre internati
- o è stata una decisione consapevole di scongiurare contro un implementazione comportamento anomalo JVM
Nel secondo caso mi aspetto una nota in un commento o nel messaggio di commento, tuttavia.
Un effetto collaterale di tale .intern()
chiamata è che non sono più initializers constant expressions ei campi non saranno inline da altre classi che fanno riferimento them.That assicurerà che la classe XMLScanner
viene caricato e il suo campo di lettura. Non penso che questo sia rilevante qui, comunque.
fonte
2012-11-02 14:24:15
+1 Buona domanda! L'effetto è lo stesso, tuttavia il bytecode generato con e senza è diverso. Immagino che non lo sapremo mai se non chiediamo direttamente agli autori, quindi non si può rispondere a questo. Direi che si trattava di un'ottica prematura. – OscarRyz