Pull to refresh

Comments 3

Иммутабельный вариант в статье всё равно не иммутабелен. Значениями в мапе могут быть вложенные мапы, которые можно изменить после этого конструктора.

Пояснение
public AlmostMutableClass(String field, Map<String, String> fieldMap) {
  this.field = field;      
  Map<String, String> deepCopy = new HashMap<String, String>();
  for(String key : fieldMap.keySet()) {
    deepCopy.put(key, fieldMap.get(key));
  }
  this.fieldMap = deepCopy;
}

Здесь «deepCopy» на самом деле является shallow copy. Поэтому если вызывающий код сохранил ссылку на одно из значений в мапе, которое является вложенной мапой, то значение в этой вложенной мапе потом можно изменить.

Также непонятно, зачем создавать копию в геттере, когда поле может быть иммутабельной мапой (завёрнуто).
Sign up to leave a comment.