2010-11-04 25 views
2

Si je veux une carte vide ou une carte d'un élément, Java Collections a une méthode pour cela. Pourquoi n'y a-t-il pas de méthode pour plus d'un élément? Quelle est la meilleure façon de créer une carte finale statique avec 2 éléments? Je sais que je peux faire quelque chose comme:Pourquoi les collections Java ont-elles des aides pour 0 ou 1 mais pas plus d'éléments?

private static final Map<String, String> MAP = new HashMap<String, String>() { 
    { put("a", "b"); put("c", "d"); } 
}; 

Mais Eclipse se plaint du serialVersionUID ...

+0

Je ne suis pas sûr de bien comprendre votre question - voulez-vous insérer un groupe entier d'éléments dans un seul appel? Comme un «put» qui peut mettre plus d'un élément dans la carte en même temps? – birryree

+1

Attendez Java 7. – Jeremy

+0

@birryree Oui, je veux créer la carte finale statique en un appel, ou dans le moins de place possible. Même avec le put que vous décrivez, vous devez déclarer un serialVersionUID pour eclipse pour être heureux. –

Répondre

16

La raison Collections a des méthodes pour 0 et 1 des cartes d'entrée est parce qu'ils sont des cas particuliers .. le vide Map est un singleton immuable par exemple.

Pour ce que vous voulez faire, cependant, je recommande fortement d'utiliser Guava. Ses collections Immutable* (ImmutableMap spécifiquement) sont ce que vous voulez que je pense:

private static final ImmutableMap<String, String> MAP = ImmutableMap.of(
    "a", "b", 
    "c", "d"); 

Vous pouvez faire ci-dessus pour les petites cartes, et des cartes plus grandes vous pouvez écrire:

private static final ImmutableMap<String, String> MAP = 
    ImmutableMap.<String, String>builder() 
     .put("a", "b") 
     .put("b", "c") 
     ... 
     .put("y", "z") 
     .build(); 

Si vous n'êtes pas utilisez Goyave, vous voudrez probablement toujours vous assurer que cette carte ne peut pas être changée. Ceci est beaucoup plus laid:

private static final Map<String, String> MAP; 

static { 
    Map<String, String> temp = new HashMap<String, String>(); 
    temp.put("a", "b"); 
    temp.put("b", "c"); 
    MAP = Collections.unmodifiableMap(temp); 
} 
+0

Excellente réponse, juste appris un peu sur les collections, merci! –

0

Utilisez la valeur de retour d'une fonction statique:

private static final Map<String, String> Map = buildMap(); 

private static Map<String, String> buildMap() { 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("a", "b"); 
    map.put("c", "d"); 
    return map; 
} 

EDIT: Non. Ma "const" C/C++ est en train de se montrer. Une variable finale ne peut être affectée qu'une seule fois, mais l'objet assigné à cette variable est encore tout à fait modifiable.

2

Les objets modifiables comme les cartes peuvent être modifiés même s'ils sont statiques et définitifs. Final signifie simplement que la référence à l'objet ne peut pas changer. Vous n'avez pas besoin d'ajouter les objets à l'initialisation. La carte peut être ajoutée et modifiée dans d'autres zones du code, mais vous ne pouvez pas affecter un objet différent à la variable MAP ultérieurement.

Si vous souhaitez l'initialiser avec deux éléments, vous pouvez les ajouter dans un bloc statique après la déclaration.

static { 
    MAP.put("a", "b"); 
    MAP.put("c", "d"); 
} 

This article a quelques bonnes informations sur la façon dont fonctionnent les blocs statiques.

Si vous voulez une carte immuable avec deux éléments, vous pouvez utiliser un bloc statique à nouveau comme ceci:

private static final Map<String, String> MAP; 
static { 
    Map<String, String> tempMap = new HashMap<String, String>(); 
    tempMap.put("a", "b"); 
    tempMap.put("c", "d"); 
    MAP = Collections.unmodifiableMap(tempMap); 
} 
1

Essayez cette (version modifiée de ce que Mark Storer a écrit):

private static final Map<String, String> Map = buildMap(); 

private static Map<String, String> buildMap() { 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("a", "b"); 
    map.put("c", "d"); 
    return Collections.unmodifiableMap(map); 
} 
+0

(ou utiliser un intialisateur «statique», selon le goût, ou pourrait vouloir (ou non) mettre une capacité pour la carte, laquelle IIRC devrait être au moins un tiers plus grande que la taille.) –

0

Si elles fournissent 0..N pour tout N vous demanderez pourquoi pas N + 1 pris en charge. N = 0 et N = 1 sont des cas spéciaux facilement manipulables.

+0

vous voulez dire, il n'y a que trois cas: 0, 1, plus de 1 –