Неизменяемые строки и последнее ключевое слово - PullRequest
0 голосов
/ 20 ноября 2011

Я обычно помещаю глобальные переменные времени компиляции (например, константы, которые я использую, такие как число Авогадро или что-то еще) в публичные статические конечные переменные. Тем не менее, я никогда не задумывался, действительно ли это что-то делает для строк. Есть ли смысл делать финал String, поскольку он уже неизменен?

Это теоретический, а не практический вопрос.

Ответы [ 3 ]

10 голосов
/ 20 ноября 2011

final отличается от неизменяемого. final означает, что обработчик (переменная) не может указывать на другой объект. Неизменяемый означает, что объект не может изменить свое внутреннее состояние.

  • static final Foo foo = new Foo(1) означает, что вы не можете иметь позже foo = new Foo(2)
  • если Foo является неизменным, это означает, что после его создания вы не сможете изменить его поля. Например. Вы не можете иметь Foo foo = new Foo(1); foo.setValue(3);
2 голосов
/ 20 ноября 2011

Вы путаете ссылку на строку и фактическую строку. Immutable описывает фактический строковый объект и означает, что вы не можете изменить значение этого объекта. Final ссылается на ссылку на строковый объект и означает, что вы не можете изменить строку, на которую указывает эта ссылка. Рассмотрим следующий код: public static String str = "happy"; ... str = "sad";

Этот код создает два строковых объекта, один из которых содержит значение "happy", а другой - значение "sad". Ни один из этих объектов (поскольку строки являются неизменяемыми) не может быть изменен. str является ссылкой и может указывать на любой из этих объектов; однако, если бы мы изменили первую строку кода на: public static final String str = "happy"; str = "sad" больше не будет законным. Поскольку мы изменили str как конечную переменную, она не может указывать на разные объекты.

1 голос
/ 20 ноября 2011

final относится только к ссылке.Если вы объявляете Object окончательно, это не означает, что объект не может быть изменен, это запрещает ссылку на объект, который будет изменен.Это не то же самое, что неизменный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...