dado el ejemplo específico:
static final Map FOO = Collections.unmodifiableMap(new HashMap());
Entonces FOO habrá inmutable. Tampoco tendrá ningún elemento.Dado el caso más general de:
static final Map BAR = Collections.unmodifiableMap(getMap());
Entonces si es o no es inmutable es totalmente dependiente de si o no a otra persona puede llegar al mapa subyacente, y qué tipo de mapa que es. Por ejemplo, si se trata de un LinkedHashMap, la lista vinculada subyacente podría modificarse por orden de acceso y podría cambiar llamando a get(). La forma más segura (utilizando clases no concurrentes) para hacer esto sería:
static final Map BAR = Collections.unmodifiableMap(new HashMap(getMap()));
la javadocs for HashMap implica que, mientras no efectúe cambios estructurales en el mapa, entonces es seguro de usar en forma concurrente, por lo que este debería ser seguro para cualquiera de los accesores que pueda usar, es decir, obtener los diversos conjuntos e iterar sobre ellos y get() debería ser seguro.
Si puede utilizar las clases concurrentes, entonces también podría hacer:
static final Map BAR = Collections.unmodifiableMap(new ConcurrentHashMap(getMap());
Ésta será explícitamente seguro de usar desde varios subprocesos, ya que es ConcurrentHashMap explícitamente el acceso de múltiples subprocesos. El estado interno puede ser mutable, pero el estado visible externamente no lo será, y dado que se garantiza que la clase será segura para hilos, podemos considerar que es externamente inmutable.
En realidad es una buena pregunta. Piensa en 'WeakHashMap', eso puede cambiar sin cambiar. 'LinkedHashMap' en el modo de orden de acceso es el mismo. –
(Es posible que desee copiar el título de su pregunta en la pregunta: ceguera de banner.) –
El autor tiene una buena pregunta. Digamos que escribo mi propia implementación de mapas. Supongamos que en cada búsqueda, reorganiza su estructura interna para que los elementos más buscados se encuentren más rápido la próxima vez. El usuario envuelve dicho mapa con una colección no modificable y asume que es seguro para los hilos. Luego, 2 subprocesos acceden a diferentes valores simultáneamente y el optimizador interno daña el estado interno del mapa. – z5h