Me gustaría crear un nuevo elemento que de forma similar a Util.Map.Entry
que contenga la estructura key
, value
.
El problema es que no puedo instanciar un Map.Entry
porque es una interfaz.
¿Alguien sabe cómo crear un nuevo objeto clave/valor genérico para Map.Entry?
Hay public static class AbstractMap.SimpleEntry<K,V>
. No dejes que la parte Abstract
del nombre te engañe: de hecho NO es una clase abstracta
(pero su nivel superior AbstractMap
sí lo es).
El hecho de que sea una clase anidada estática
significa que DON'T necesita una instancia de AbstractMap
para instanciarla, así que algo como esto compila bien:
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Como se señaló en otra respuesta, Guava también tiene un conveniente método de fábrica static
Maps.immutableEntry
que puedes utilizar.
Usted dijo:
No puedo usar Map.Entry
porque aparentemente es un objeto de sólo lectura que no puedo instanciar como nuevo instanceof
.
Eso no es del todo correcto. La razón por la que no se puede instanciar directamente (es decir, con new
) es porque es una interface Map.Entry
.
Como se indica en la documentación, AbstractMap.SimpleEntry
es desde la versión 1.6
, por lo que si estás atascado en la versión 5.0, no está disponible para ti.
Para buscar otra clase conocida que implemente Map.Entry
, de hecho puedes ir directamente al javadoc. Desde la versión de Java 6
Interfaz Map.Entry<K,V>
Todas las clases implementadoras conocidas:
Desgraciadamente, la versión 1.5 no lista ninguna clase de implementación conocida que puedas utilizar, así que puede que te veas obligado a implementar la tuya propia.
Puedes implementar tú mismo la interfaz Map.Entry<K, V>
:
import java.util.Map;
final class MyEntry<K, V> implements Map.Entry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
Y luego usarlo:
Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
Pruebe Maps.immutableEntry de Guava
Esto tiene la ventaja de ser compatible con Java 5 (a diferencia de AbstractMap.SimpleEntry
que requiere Java 6.)