Мне интересно, какие преимущества имеют строковый тип, неизменяемый с точки зрения программистов.
Технические преимущества (на стороне компилятора/языка) можно суммировать в основном, что легче делать оптимизацию, если тип неизменен. Прочитайте здесь по соответствующему вопросу.
Кроме того, в изменяемом строковом типе либо у вас уже есть потоковая безопасность (тогда опять оптимизация сложнее), либо вам нужно сделать это самостоятельно. В любом случае у вас будет выбор использовать изменяемый тип строки со встроенной безопасностью потоков, поэтому это не является преимуществом неизменяемых строковых типов. (Опять же, будет легче сделать обработку и оптимизацию, чтобы обеспечить безопасность потоков на неизменяемом типе, но здесь дело не в этом.)
Но каковы преимущества неизменяемых строковых типов в использовании? Какой смысл иметь некоторые типы неизменяемыми, а другие нет? Это кажется мне очень непоследовательным.
В С++, если я хочу, чтобы какая-либо строка была неизменяемой, я передаю ее как константную ссылку на функцию (const std::string&
). Если я хочу иметь переменную копию исходной строки, я передаю ее как std::string
. Только если я хочу изменить его, я передаю его как ссылку (std::string&
). Поэтому у меня есть выбор того, что я хочу делать. Я могу просто сделать это с любым возможным типом.
В Python или в Java некоторые типы неизменяемы (в основном все примитивные типы и строки), другие - нет.
В чистых функциональных языках, таких как Haskell, все неизменно.
Есть ли веская причина, почему имеет смысл иметь эту несогласованность? Или это просто по техническим причинам низкого уровня?