使用方法和静态块

枚举可以包含方法,就像任何类一样。要了解其工作原理,我们将声明一个这样的枚举:

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

让我们有一个方法,以相反的方向返回枚举:

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

通过使用字段和静态初始化程序块可以进一步改进这一点:

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

在该示例中,相反方向存储在私有实例字段 opposite 中,其在第一次使用 Direction 时被静态初始化。在这种特殊情况下(因为 NORTH 引用 SOUTH 而且相反),我们不能在这里使用 Enums 和构造函数 (构造函数 NORTH(SOUTH), SOUTH(NORTH), EAST(WEST), WEST(EAST) 会更优雅并且允许 opposite 被声明为 final,但是它将是自引用的,因此是不允许的)。