интернирование было бы правильным решением, если у вас действительно есть проблема. Java хранит строковые литералы и множество других строк во внутреннем пуле, и когда новая строка собирается быть созданной, JVM сначала проверяет, находится ли строка уже в пуле. Если да, он не создаст новый экземпляр, но передаст ссылку на interned String объект.
Есть два способа контролировать это поведение:
String interned = String.intern(aString); // returns a reference to an interned String
String notInterned = new String(aString); // creates a new String instance (guaranteed)
Так что возможно , библиотеки действительно создают новые экземпляры для всех значений атрибутов xml. Это возможно, и вы не сможете изменить его.
intern имеет глобальный эффект. Внутренняя строка сразу доступна «для любого объекта» (это представление на самом деле не имеет смысла, но может помочь понять его).
Итак, допустим, у нас есть строка в классе Foo
, метод foolish
:
String s = "ABCD";
Строковые литералы интернируются немедленно. JVM проверяет, находится ли «ABCD» в пуле, если нет, «ABCD» хранится в пуле. JVM назначает ссылку на интернированную строку для s
.
Теперь, может быть, в другом классе Bar
, в методе barbar
:
String t = "AB"+"CD";
Затем JVM интернирует «AB» и «CD», как описано выше, создает сцепленную строку, смотрит, если она уже есть, Эй, да, это так, и присваивает ссылку на интернированную строку «ABCD» для t
.
Звонок "PROD".intern()
может работать или не работать. Да, это будет интерна String "PROD"
. Но есть вероятность, что Jibx действительно создает новые строки для значений атрибутов с
String value = new String(getAttributeValue(attribute));
В этом случае значение будет иметь не ссылку на интернированную строку (даже если "PROD"
в пуле), но ссылку на новый экземпляр строки в куче.
И, к другому вопросу в вашей команде: это происходит только во время выполнения. Компиляция просто создает файлы классов, пул строк - это структура данных в куче объектов, которая используется JVM, которая выполняет приложение.