2012-11-02 17 views
5

Nel codice sorgente di com.sun.org.apache.xerces.internal.impl.XMLScanner alla linea 183 e 186internato automaticamente delle stringhe letterali

183 protected final static String fVersionSymbol = "version".intern(); 

186 protected final static String fEncodingSymbol = "encoding".intern(); 

Perché "versione" e "encoding" sono esplicitamente internati utilizzando intern() mentre sono stringhe letterali e verrebbero automaticamente internati?

+2

+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

risposta

6

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.

+1

dal messaggio di commit: '...Molte stringhe predefinite vengono aggiunte alle tabelle dei simboli ogni volta che il parser viene ripristinato ... Ora, poiché chiamiamo String # intern per String nella tabella dei simboli ... è sufficiente usare String # intern per quei simboli predefiniti. Questo deve essere eseguito solo una volta. - È chiaro che l'autore non vuole aggiungere SIMBOLI DI STRUMENTI PREDEFINITI dal codice ancora e ancora alla tabella dei simboli ogni volta che il parser viene ripristinato. Quindi è molto probabile che l'autore non sia a conoscenza del fatto che i letterali stringa vengono automaticamente internati. –

4

Non credo ci sia alcuna buona ragione per questo, per la ragione che si è identificato: letterali sono sempre internati automaticamente, come defined by the String class:

Tutte le stringhe letterali e le espressioni costanti di stringa a valore sono internati. I valori letterali stringa sono definiti nella sezione 3.10.5 della Specifica linguaggio Java ™.

+1

quindi è un esempio di cattiva programmazione? –

+2

@aLearner: Suppongo. Probabilmente non lo metterei così forte, ma almeno se c'è una buona ragione per farlo (cosa di cui dubito) mi aspetterei un commento che spieghi di cosa si tratta. –

Problemi correlati