Java Language Utilizando métodos y bloques estáticos.


Ejemplo

Una enumeración puede contener un método, al igual que cualquier clase. Para ver cómo funciona esto, declararemos una enumeración como esta:

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

Tengamos un método que devuelva la enumeración en la dirección opuesta:

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

Esto se puede mejorar aún más mediante el uso de campos y bloques de inicialización estáticos:

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

En este ejemplo, la dirección opuesta se almacena en un campo de instancia privada opposite , que se inicializa de forma estática la primera vez que se utiliza una Direction . En este caso particular (debido a que el NORTH referencia al SOUTH y viceversa), no podemos usar Enums con constructores aquí (los Constructores NORTH(SOUTH), SOUTH(NORTH), EAST(WEST), WEST(EAST) serían más elegantes y permitirían opposite a ser declarado final , pero sería auto-referencial y por lo tanto no está permitido).