Java Language Enums avec des champs statiques


Exemple

Si votre classe enum doit avoir des champs statiques, gardez à l'esprit qu'ils sont créés après les valeurs enum elles-mêmes. Cela signifie que le code suivant entraînera une NullPointerException :

enum Example {
    ONE(1), TWO(2);

    static Map<String, Integer> integers = new HashMap<>();

    private Example(int value) {
        integers.put(this.name(), value);
    }
}

Un moyen possible de résoudre ce problème:

enum Example {
    ONE(1), TWO(2);

    static Map<String, Integer> integers;

    private Example(int value) {
        putValue(this.name(), value);
    }

    private static void putValue(String name, int value) {
        if (integers == null)
            integers = new HashMap<>();
        integers.put(name, value);
    }
}

Ne pas initialiser le champ statique:

enum Example {
    ONE(1), TWO(2);

    // after initialisisation integers is null!!
    static Map<String, Integer> integers = null;

    private Example(int value) {
        putValue(this.name(), value);
    }

    private static void putValue(String name, int value) {
        if (integers == null)
            integers = new HashMap<>();
        integers.put(name, value);
    }
    // !!this may lead to null poiner exception!!
    public int getValue(){
        return (Example.integers.get(this.name()));
    }
}

initialisation:

  • créer les valeurs enum
    • comme effet secondaire appelé putValue () qui initialise les entiers
  • les valeurs statiques sont définies
    • integers = null; // est exécuté après les énumérations pour que le contenu des entiers soit perdu