java - ejemplo - linkedhashmap como funciona
¿Existe una implementación de Java Map que imponga las claves finales? (2)
No hay tal implementación en el JDK. Tu mejor apuesta aquí es usar la composición:
public final class CustomMap<K, V>
implements Map<K, V>
{
private final Map<K, V> delegate;
public CustomMap(final Map<K, V> delegate)
{
this.delegate = delegate;
}
@Override
public V put(final K key, final V value)
{
// Can''t use the return value of delegate.put(), since some implementations
// allow null values; so checking delegate.put() == null doesn''t work
if (delegate.containsKey(key))
throw new IllegalArgumentException("duplicate key: " + key);
return delegate.put(key, value);
}
@Override
public void putAll(@Nonnull final Map<? extends K, ? extends V> m)
{
for (final Entry<? extends K, ? extends V> entry: m.entrySet())
put(entry.getKey(), entry.getValue());
}
// delegate all other methods
}
De lo contrario, como otros sugirieron, si usa Guava, use ForwardingMap; Esta es esencialmente una versión generalizada del código anterior.
De hecho, utilice guayaba.
otra nota: no puedes simplemente // throws some exception
aquí; Map
.put()
no declara lanzar ninguna excepción, por lo que su única opción es lanzar una excepción no marcada aquí.
Necesito un Map
, que una vez que una clave obtiene un valor, cualquier intento adicional de poner un valor en la misma clave generará una excepción.
Por ejemplo:
map.put("John", 3); //OK
map.put("John", 7); // throws some exception
map.put("John", 11); // throws some exception
Por supuesto, puedo implementar esto por mi cuenta (p. Ej., Extendiendo HashMap
, o rodeando cada llamada para put
con if map.contains(key)
), pero prefiero usar algo ya hecho que mantenga limpio mi código.
¿Alguien sabe de tal implementación?
ImmutableMap
clase ImmutableMap
en las bibliotecas Java de Google (Guava) es la solución que está buscando. Desea claves finales, lo que implica que los valores en su mapa también serán finales. Y puedes construir tu mapa así:
ImmutableMap<String,Integer> myMap = ImmutableMap.<String, Integer>builder()
.put("john", 3)
.put("rogerio", 5)
.put("alfonso", 45)
.put("leonidas", 577)
.build();