Java Language Utilizzo di metodi e blocchi statici

Esempio

Un enum può contenere un metodo, proprio come qualsiasi classe. Per vedere come funziona, dichiareremo un enume come questo:

public enum Direction {
    NORTH, SOUTH, EAST, WEST;
}

Prendiamo un metodo che restituisce l'enum nella direzione opposta:

public enum Direction {
    NORTH, SOUTH, EAST, WEST;

    public Direction getOpposite(){
        switch (this){
            case NORTH:
                return SOUTH;               
            case SOUTH:
                return NORTH;                
            case WEST:
                return EAST; 
            case EAST:
                return WEST;  
            default: //This will never happen
                return null;
        }
    }
}

Questo può essere ulteriormente migliorato attraverso l'uso di campi e blocchi di inizializzazione statici:

public enum Direction {
    NORTH, SOUTH, EAST, WEST;
    
    private Direction opposite;
    
    public Direction getOpposite(){
        return opposite;
    }
    
    static {
        NORTH.opposite = SOUTH;
        SOUTH.opposite = NORTH;
        WEST.opposite = EAST;
        EAST.opposite = WEST;
    }
}

In questo esempio, la direzione opposta viene memorizzata in un campo di istanza privato opposite , che viene inizializzato staticamente la prima volta che viene utilizzata una Direction . In questo caso particolare (perché NORTH riferimento al SOUTH e viceversa), non possiamo usare Enum con costruttori qui (Costruttori NORTH(SOUTH), SOUTH(NORTH), EAST(WEST), WEST(EAST) sarebbe più elegante e consentirebbe il opposite essere dichiarato final , ma sarebbe autoreferenziale e quindi non consentito).