使用方法和靜態塊

列舉可以包含方法,就像任何類一樣。要了解其工作原理,我們將宣告一個這樣的列舉:

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,但是它將是自引用的,因此是不允許的)。