С учетом конкретного примера:
static final Map FOO = Collections.unmodifiableMap(new HashMap());
Тогда FOO будет неизменным. Это также никогда не будет иметь никаких элементов. Учитывая более общий случай:
static final Map BAR = Collections.unmodifiableMap(getMap());
Тогда то, является ли это неизменным или нет, полностью зависит от того, сможет ли кто-то еще добраться до базовой Карты и какой это тип Карты. Например, если это LinkedHashMap, то базовый связанный список может быть изменен в соответствии с порядком доступа и может быть изменен путем вызова get (). Самый безопасный способ (используя не параллельные классы) сделать это:
static final Map BAR = Collections.unmodifiableMap(new HashMap(getMap()));
* Javadocs для HashMap подразумевают, что до тех пор, пока вы не вносите никаких структурных изменений в карту, его можно безопасно использовать одновременно, так что это должно быть безопасно для любого из методов доступа, которые вы можете использовать то есть получение различных наборов и итерирование по ним, а затем get () должны быть безопасными.
Если вы можете использовать параллельные классы, то вы также можете сделать:
static final Map BAR = Collections.unmodifiableMap(new ConcurrentHashMap(getMap());
Это будет явно безопасно для использования из нескольких потоков, поскольку ConcurrentHashMap явно безопасен для многопоточного доступа. Внутреннее состояние может быть изменяемым, но внешне видимое состояние не будет, и поскольку класс гарантированно является потокобезопасным, мы можем смело считать его внешне неизменным.