I'gostaria de criar um novo item que, de forma semelhante ao Util.Map.Entry
que conterá a estrutura key
, value
.
O problema é que eu posso't instanciar um Map.Entry
porque ele'é uma interface.
Alguém sabe como criar um novo objecto de chave/valor genérico para Map.Entry?
There's public static class AbstractMap.SimpleEntry<K,V>
. Don'não deixe que a parte Abstract
do nome o engane: é de facto NÃO uma classe abstract
(mas o seu nível superior AbstractMap
é).
O facto de ser's uma classe "estática" significa que você DON'T precisa de uma instância "Mapa Abstrato" para o instanciar, por isso algo como isto compila bem:
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Como referido noutra resposta, a Goiaba também tem um método de fábrica "estático" conveniente Maps.immutableEntry
que pode utilizar.
Disse o senhor:
'não posso'não posso utilizar o próprio "Mapa.de Entrada" porque aparentemente é'é um objecto só de leitura que eu posso'não instânciar nova "instancia de".
Isso's não é inteiramente exacto. A razão pela qual se pode't instanciar directamente (isto é, com novo
) é porque é's um interface Map.Entry
.
Como foi observado na documentação, AbstractMap.SimpleEntry
é @since 1.6
, portanto se você're stuck to 5.0, então ele's não está disponível para si.
Para procurar outra classe conhecida que implements Map.Entry
, pode de facto ir directamente para o javadoc. A partir de a versão Java 6
Mapa de Interface.Entry<K,V>
**Todas as classes de implementação conhecidas***:
Infelizmente a versão 1.5 não lista nenhuma classe de implementação conhecida que possa utilizar, pelo que pode ter ficado preso à implementação da sua própria classe.
Pode simplesmente implementar o Map.Entry<K, V>
interface você mesmo:
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;
}
}
E depois utilizá-lo:
Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
Experimente Maps.immutableEntry de Guava
Isto tem a vantagem de ser compatível com Java 5 (ao contrário do `AbstractMap.SimpleEntry' que requer Java 6).