1194 votes

Comment Initialiser une Carte statique en Java

Comment feriez-vous pour initialiser une Carte statique en Java?

Méthode: initialiseur Statique
Méthode deux: exemple initialiser (anonyme sous-classe) ou une autre méthode?

Quels sont les avantages et les inconvénients de chacun?

Voici un exemple qui illustre deux méthodes:

import java.util.HashMap;
import java.util.Map;

public class Test {
    private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
    static {
        myMap.put(1, "one");
        myMap.put(2, "two");
    }

    private static final Map<Integer, String> myMap2 = new HashMap<Integer, String>(){
        {
            put(1, "one");
            put(2, "two");
        }
    };
}

1163voto

Miserable Variable Points 17515

L'instance initialiser est juste sucre syntaxique dans ce cas, non? Je ne vois pas pourquoi vous avez besoin d'un supplément de la classe anonyme juste pour initialiser. Et il ne fonctionnera pas si la classe en cours de création est définitive.

Vous pouvez créer un immuable de la carte en utilisant un statique initialiser trop:

public class Test {
    private static final Map<Integer, String> myMap;
    static {
        Map<Integer, String> aMap = ....;
        aMap.put(1, "one");
        aMap.put(2, "two");
        myMap = Collections.unmodifiableMap(aMap);
    }
}

Edit: Cette réponse est devenue un vote de l'aimant, mais je vais m'arrêter ici et de le modifier dans un wiki de la communauté

465voto

Jonik Points 18905

J'aime la Goyave façon d'initialisation statique, immuable la carte:

static final Map<Integer, String> MY_MAP = ImmutableMap.of(
        1, "one",
        2, "two"
);

Comme vous pouvez le voir, il est très concis (en raison de la pratique de méthodes de fabrique en ImmutableMap).

Edit: Si vous voulez la carte à plus de 5 entrées, vous ne pouvez plus utiliser ImmutableMap.of(). Au lieu de cela, essayez ImmutableMap.builder() le long de ces lignes:

static final Map<Integer, String> MY_MAP = ImmutableMap.<Integer, String>builder()
    .put(1, "one")
    .put(2, "two")
    // ... 
    .put(15, "fifteen")
    .build();

Pour en savoir plus sur les avantages de Goyave immuables de collection, utilitaires, reportez-vous Immuable Collections Expliqué dans la Goyave Guide de l'Utilisateur.

(Un sous-ensemble de) Goyave utilisé pour être appelé Google Collections. Si vous n'êtes pas à l'aide de cette bibliothèque dans votre projet Java et pourtant, j'ai fortement recommander de l'essayer! La goyave est rapidement devenu l'un des plus populaire et utile gratuit 3e partie libs Java, en tant que fellow de SORTE que les utilisateurs acceptent. (Si vous êtes nouveau à cela, il ya quelques excellentes ressources d'apprentissage derrière ce lien.)

196voto

Peter Štibraný Points 17507

Je voudrais utiliser:

public class Test {
    private static final Map<Integer, String> MY_MAP = createMap();

    private static Map<Integer, String> createMap() {
        Map<Integer, String> result = new HashMap<Integer, String>();
        result.put(1, "one");
        result.put(2, "two");
        return Collections.unmodifiableMap(result);
    }
}
  1. il évite la classe anonyme, que je considère personnellement comme un mauvais style, et d'éviter
  2. il fait de la création de la carte plus explicite
  3. il rend une carte inmodifiable
  4. comme MY_MAP est constante, je voudrais nommer comme constante

189voto

Chris Noe Points 8375

Java 5 présente cette plus compact de la syntaxe:

static final Map<String , String> FLAVORS = new HashMap<String , String>() {{
    put("Up",    "Down");
    put("Charm", "Strange");
    put("Top",   "Bottom");
}};

101voto

Outlaw Programmer Points 6610

Un avantage de la deuxième méthode est que vous pouvez l'envelopper avec des Collections.unmodifiableMap() pour garantir que rien ne va mise à jour de la collection plus tard:

private static final Map<Integer, String> CONSTANT_MAP = 
    Collections.unmodifiableMap(new HashMap<Integer, String>() {{ 
        put(1, "one");
        put(2, "two");
    }});

 // later on...

 CONSTANT_MAP.put(3, "three"); // going to throw an exception!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X