使用方法和静态块
枚举可以包含方法,就像任何类一样。要了解其工作原理,我们将声明一个这样的枚举:
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
,但是它将是自引用的,因此是不允许的)。