Существует по крайней мере две причины.
Первый - безопасность http://www.javafaq.nu/java-article1060.html
главная причина, почему Строка, сделанная неизменной, была безопасностью. Посмотрите на этот пример: у Нас есть файл открытый метод с проверкой входа в систему. Мы передаем Строку этому методу для обработки аутентификации, которая необходима, прежде чем вызов будет передан ОС. Если Строка была изменяема, было возможно так или иначе изменить свое содержание после проверки аутентификации, прежде чем ОС получит запрос из программы тогда, возможно запросить любой файл. Таким образом, если Вы имеете право открыть текстовый файл в пользовательском каталоге, но тогда на лету, когда так или иначе Вам удается изменить имя файла, можно запросить открыть "passwd" файл или любого другого. Тогда файл может быть изменен, и будет возможно войти в систему непосредственно к ОС.
1110-секундный - эффективность Памяти http://hikrish.blogspot.com/2006/07/why-string-class-is-immutable.html
JVM внутренне поддерживает "Строковый Пул". К achive эффективность памяти JVM отошлет Строковый объект от пула. Это не создаст новые Строковые объекты. Так, каждый раз, когда Вы создаете новый строковый литерал, JVM зарегистрируется в пуле, существует ли это уже или нет. Если уже существующий в пуле, просто дайте ссылку на тот же объект или создайте новый объект в пуле. Будет много ссылочных точек к тем же Строковым объектам, если кто-то изменит значение, они будут влиять на все ссылки. Так, солнце решило сделать его неизменным.
Цель объединения
- позволить хранить различные типы объектов в узлах, генерируемых flex.
Чтобы лучше объяснить, вы можете, например, :
%union
{
int intValue;
float floatValue;
char *stringValue;
}
в .y
, если вы хотите обеспечить базовую поддержку для типов int
, float
и string
. Что вы можете с этим сделать?
Две вещи:
Во-первых, вы можете автоматически устанавливать правильные значения при генерации токенов. Подумайте о .
Объявление % union
изменяет тип yylval
.
В руководстве bison
объясняется ]:
В обычном (не реентерабельном) анализаторе семантическое значение токена должно быть сохранено в глобальной переменной
yylval
. Когда вы используете только один тип данных для семантических значений,yylval
имеет этот тип. Таким образом, если типом являетсяint
(по умолчанию), вы можете записать это вyylex
:... yylval = значение; / * Помещаем значение в стек Bison. * / return INT; / * Возвращаем тип токена. * / ...
Когда вы используете несколько типов данных, тип
yylval
представляет собой объединение, созданное из объявления% union
(см. Раздел «Коллекция типов значений»). Поэтому, когда вы храните значение токена, вы должны использовать правильный член объединения. Если объявление% union
выглядит так:% union { int intval; двойной вал; symrec * tptr; }
тогда код в
yylex
может выглядеть так:... yylval.intval = значение; / * Помещаем значение в стек Bison. * / return INT; / * Возвращаем тип токена. * / ...