Здесь:
mapImmutable = ImmutableMap.copyOf(map3);
Вы фактически не меняете содержимое карты, к которой относится поле mapImmutable
. Вы заставляете mapImmutable
ссылаться на совершенно другую карту!
ImmutableMap
неизменность не означает, что вы можете сбросить переменную этого типа. Это только означает, что его экземпляры не изменятся. например, вы не можете добавлять новые элементы на карту или удалять элементы с нее. В приведенной выше строке вы не изменяете экземпляры ImmutableMap
, вы создаете новый экземпляр ImmutableMap
, вызывая copyOf
и присваивая его mapImmutable
. Карта, на которую ссылался mapImmutable
, не изменяется, а просто потерян .
Если вы хотите запретить сброс поля, объявите его как final
и установите его встатический конструктор:
public final static ImmutableMap<String, String> mapImmutable;
static {
Map<String,String> map2=new HashMap<String,String>();
map2.put("name", "mark");
mapImmutable= ImmutableMap.copyOf(map2);
System.out.println(mapImmutable);
Map<String,String> map3=new HashMap<String,String>();
map3.put("Country", "USA");
map3.put("name", "Joy");
mapImmutable=ImmutableMap.copyOf(map3); // now we have an error!
System.out.println(mapImmutable);}
}
Также обратите внимание, что final
только предотвращает сброс поля / переменной, но не препятствует изменению объекта. Если у вас есть final HashMap
, вы все равно можете добавить к нему KVP.