我想声明一个枚举Direction,它具有一个返回相反方向的方法(以下语法不正确,即,不能实例化枚举,但它说明了我的观点)。这在Java中可行吗?
这是代码:
public enum Direction { NORTH(1), SOUTH(-1), EAST(-2), WEST(2); Direction(int code){ this.code=code; } protected int code; public int getCode() { return this.code; } static Direction getOppositeDirection(Direction d){ return new Direction(d.getCode() * -1); } }
对于那些按标题吸引的人:是的,您可以在枚举中定义自己的方法。如果您想知道如何调用这种非静态方法,则可以使用与其他任何非静态方法相同的方法- 在定义或继承该方法的类型实例上调用它。如果是枚举,则此类实例仅为ENUM_CONSTANTs。
ENUM_CONSTANT
因此,您所需要做的就是EnumType.ENUM_CONSTANT.methodName(arguments)。
EnumType.ENUM_CONSTANT.methodName(arguments)
现在让我们从问题回到问题。解决方案之一可能是
public enum Direction { NORTH, SOUTH, EAST, WEST; private Direction opposite; static { NORTH.opposite = SOUTH; SOUTH.opposite = NORTH; EAST.opposite = WEST; WEST.opposite = EAST; } public Direction getOppositeDirection() { return opposite; } }
现在Direction.NORTH.getOppositeDirection()将返回Direction.SOUTH。
Direction.NORTH.getOppositeDirection()
Direction.SOUTH
这是说明@jedwards注释的更多“ hacky”方法,但是它不如第一种方法灵活,因为添加更多字段或更改其顺序将破坏我们的代码。
public enum Direction { NORTH, EAST, SOUTH, WEST; // cached values to avoid recreating such array each time method is called private static final Direction[] VALUES = values(); public Direction getOppositeDirection() { return VALUES[(ordinal() + 2) % 4]; } }