Śledziłem zmianę do revision 318617 in the Apache Xerces SVN Repository (jest to projekt, w którym pierwotnie opracowano analizator składni XML, jak sugeruje nazwa pakietu).
Istotna część wiadomości popełnienia jest:
Próbując poprawić wykorzystanie tabel symboli. Wiele predefiniowanych ciągów znaków jest dodawanych do tabel symboli za każdym razem, gdy parser jest resetowany. Dla małych dokumentów, byłby to znaczny koszt. Teraz, ponieważ wywołujemy String # intern dla Ciągów znaków w tabeli symboli, wystarczy użyć String # intern dla wstępnie zdefiniowanych symboli . Tę czynność należy wykonać tylko raz.
Jak już wspomniano, .intern()
nie powinno być konieczne (i nie powinno mieć widocznego efektu) na zgodnej implementacji JVM.
Domyślam się, że
- albo autor nie był świadomy faktu, że literały łańcuchowe zawsze będzie internowany
- lub była to świadoma decyzja, aby zapobiec przed realizacją wadliwie JVM
W drugim przypadku spodziewałbym się jednak uwagi w komentarzu lub w komunikacie z komentarzem.
Jednym efektem ubocznym tego .intern()
połączenia jest to, że nie są już inicjalizatory constant expressions i pola nie będą wstawiane przez inne klasy odwołującego them.That zagwarantuje, że klasa XMLScanner
jest załadowany i jego pole czytać. Nie sądzę jednak, żeby miało to znaczenie.
+1 Dobre pytanie! Efekt jest taki sam, jednak kod bajtowy generowany zi bez i jest inny. Sądzę, że nigdy się nie dowiemy, chyba że zapytamy bezpośrednio autorów, więc nie można na nie odpowiedzieć. Powiedziałbym, że była to przedwczesna optymalizacja. – OscarRyz