Java Language Enum con costruttori


Esempio

Un enum non può avere un costruttore pubblico; tuttavia, i costruttori privati ​​sono accettabili (i costruttori per le enumerazioni sono pacchetti-privati per impostazione predefinita):

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

Si consiglia di mantenere tutti i campi privati ​​e di fornire metodi getter, in quanto vi è un numero finito di istanze per un enum.


Se invece dovessi implementare un Enum come class , assomiglierebbe a questo:

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

Le costanti Enum sono tecnicamente mutabili, quindi è possibile aggiungere un setter per modificare la struttura interna di una costante enum. Tuttavia, questa è considerata una pratica molto negativa e dovrebbe essere evitata.

La migliore pratica è rendere immutabili i campi Enum, con final :

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

    private final int value;

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

    ...

}

È possibile definire più costruttori nella stessa enumerazione. Quando lo fai, gli argomenti che passi nella tua dichiarazione enum decidono quale costruttore è chiamato:

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;
    }

    ...

}

Nota: tutti i campi enumerati non primitivi dovrebbero implementare Serializable perché la classe Enum fa.