Сделайте содержимое карты окончательным после инициализации, но не саму карту
Мне нужно убедиться, что содержимое карты является окончательным, оно однажды инициализируется с помощью:
Map<K, V> map = new HashMap<K, V>(iAnotherMap);
Каждый вызов методов, которые изменяют содержимое карты (как положить, удалить, заменить...), приведет к ошибкам.
Но я все равно смог бы выполнить другое:
map = new HashMap<K, V>(iAnotherMap);
Есть ли способ добиться этого?
Спасибо
РЕДАКТИРОВАТЬ: Попытка подхода Collections.unmodifiableMap, но есть проблема:
Класс, который я хочу обернуть:
public class IndexedHashMap<K, T> implements Map<K, Pair< Integer, T >>, Serializable
Следующий код возвращает ошибку:
IndexedHashMap< K, T > mCurrent = new IndexedHashMap< K, T >();
IndexedHashMap< K, T > mConstantCurrent = Collections.unmodifiableMap(mCurrent);'
Несоответствие типов: невозможно преобразовать из Map> в IndexedHashMap
Есть идеи по этому поводу?
4 ответа
final
сделает вашу ссылку окончательной, но объект карты все еще будет редактируемым. Вам необходимо использовать существующую оболочку unmodifiableMap из Collections
Map<K, V> map = Collections.unmodifiableMap(new HashMap<K, V>(iAnotherMap));
или построить свою собственную реализацию
Вы можете использовать UnmodifiableMap. Однако, если ваши потребности слишком специфичны, вы должны расширить существующий класс HashMap и делать все, что захотите.
public class HashMap<K, V> extends java.util.HashMap<K, V> {
@Override
public V put(K key, V value) {
// report error
return null;
}
// similarly override other methods as you want
}
Если вы можете использовать гуаву, то вы ищете:
com.google.common.collect.ImmutableMap
Иначе, вам нужно сделать собственную реализацию HashMap, чтобы сделать ее неизменной.
В Java есть библиотека под названием Collections, и вы можете найти там очень полезные статические методы, если вы хотите, чтобы ваша Collection не изменялась. Надеюсь, это поможет, ссылки: UnmodifiableMap UnmodifiableCollection