Comments 3
Почему поля не final?
Зачем в геттере каждый раз копировать? Может лучше использовать обёртку https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#unmodifiableMap(java.util.Map) ?
Иммутабельный вариант в статье всё равно не иммутабелен. Значениями в мапе могут быть вложенные мапы, которые можно изменить после этого конструктора.
Пояснение
Здесь «deepCopy» на самом деле является shallow copy. Поэтому если вызывающий код сохранил ссылку на одно из значений в мапе, которое является вложенной мапой, то значение в этой вложенной мапе потом можно изменить.
Также непонятно, зачем создавать копию в геттере, когда поле может быть иммутабельной мапой (завёрнуто).
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.
Иммутабельность в Java