Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > StringBuilder value in Map


Автор: Escorial 17.12.2013, 18:01
Map<Integer, StringBuffer> map = new HashMap<Integer, StringBuffer>();
        StringBuffer builder = new StringBuffer();
        builder.append("some");
map.put(1, builder);
        builder.append("thing");
System.out.println(map.get(1));

В консоле выведется "something". Лично у меня вызвало это недоумение.
Причина из-за того что в map мы ложим ссылку на обьект и таким образом вызывая map.get(1) мы получаем ни что иное как ссылку на этот же обьект который был изменен.
Вопрос - как избавится от такого side эффекта (не клонируя обьект)?

Пример взял из http://jeremymanson.blogspot.ru/2008/04/immutability-in-java.html.

Автор: Stolzen 17.12.2013, 18:19
Никак, вы изменяете один и тот же объект, поэтому всегда будет side effect.
Единственный выход - использовать клонирование. Еще можно использовать неизменяемые объекты (в данном случае String), тогда об этом задумываться не нужно будет. 

Автор: Escorial 17.12.2013, 18:26
Ясно. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)