Java Language Enums avec des constructeurs


Exemple

Un enum ne peut pas avoir de constructeur public; cependant, les constructeurs privés sont acceptables (les constructeurs pour les énumérations sont package-private par défaut):

public enum Coin {
    PENNY(1), NICKEL(5), DIME(10), QUARTER(25); // usual names for US coins
    // note that the above parentheses and the constructor arguments match
    private int value;

    Coin(int value) { 
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

int p = Coin.NICKEL.getValue(); // the int value will be 5

Il est recommandé de garder tous les champs privés et de fournir des méthodes de lecture, car il existe un nombre fini d'instances pour un enum.


Si vous deviez implémenter un Enum tant que class , cela ressemblerait à ceci:

public class Coin<T extends Coin<T>> implements Comparable<T>, Serializable{
    public static final Coin PENNY = new Coin(1);
    public static final Coin NICKEL = new Coin(5);
    public static final Coin DIME = new Coin(10);
    public static final Coin QUARTER = new Coin(25);

    private int value;

    private Coin(int value){
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

int p = Coin.NICKEL.getValue(); // the int value will be 5

Les constantes enum sont techniquement modifiables, donc un setter pourrait être ajouté pour modifier la structure interne d'une constante enum. Cependant, ceci est considéré comme une très mauvaise pratique et devrait être évité.

La meilleure pratique consiste à rendre les champs Enum immuables, avec en final :

public enum Coin {
    PENNY(1), NICKEL(5), DIME(10), QUARTER(25);

    private final int value;

    Coin(int value){ 
        this.value = value;
    }

    ...

}

Vous pouvez définir plusieurs constructeurs dans le même enum. Lorsque vous le faites, les arguments que vous transmettez dans votre déclaration enum déterminent quel constructeur est appelé:

public enum Coin {
    PENNY(1, true), NICKEL(5, false), DIME(10), QUARTER(25);

    private final int value;
    private final boolean isCopperColored;

    Coin(int value){
        this(value, false);
    }

    Coin(int value, boolean isCopperColored){ 
        this.value = value;
        this.isCopperColored = isCopperColored;
    }

    ...

}

Remarque: Tous les champs d'énumération non primitifs doivent implémenter Serializable car la classe Enum fait.