Java枚举方法
我想声明一个枚举方向,它有一个方法返回相反的方向(以下不是语法上正确的,即枚举不能被实例化,但它说明了我的观点)。 这在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); } }
对于那些被标题引诱的人:是的,你可以在枚举中定义你自己的方法。 如果您想知道如何调用这种非静态方法,您可以像使用其他任何非静态方法一样来执行 – 您可以在定义或inheritance该方法的types实例上调用它。 在枚举的情况下,这些实例仅仅是ENUM_CONSTANT
。
所以你需要的是EnumType.ENUM_CONSTANT.methodName(arguments)
。
现在让我们回到问题的问题。 解决scheme之一可能是
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
。
这里有点“黑客”的方式来说明@jedwards的评论,但它不像第一种方法那样灵活
public enum Direction { NORTH, EAST, SOUTH, WEST; private static final Direction[] VALUES = values();//cached values //to avoid recreating array public Direction getOppositeDirection() { return VALUES[(ordinal() + 2) % 4]; } }
对于这样一个小的枚举,我发现最可读的解决scheme是:
public enum Direction { NORTH { @Override public Direction getOppositeDirection() { return SOUTH; } }, SOUTH { @Override public Direction getOppositeDirection() { return NORTH; } }, EAST { @Override public Direction getOppositeDirection() { return WEST; } }, WEST { @Override public Direction getOppositeDirection() { return EAST; } }; public abstract Direction getOppositeDirection(); }
这工作:
public enum Direction { NORTH, SOUTH, EAST, WEST; public Direction oppose() { switch(this) { case NORTH: return SOUTH; case SOUTH: return NORTH; case EAST: return WEST; case WEST: return EAST; } throw new RuntimeException("Case not implemented"); } }
创build一个抽象方法,并让每个枚举值覆盖它。 既然你在创build它的时候知道了相反的内容,就不需要dynamic生成或者创build它。
尽pipe如此,它并不好读。 也许switch
会更易于pipe理?
public enum Direction { NORTH(1) { @Override public Direction getOppositeDirection() { return Direction.SOUTH; } }, SOUTH(-1) { @Override public Direction getOppositeDirection() { return Direction.NORTH; } }, EAST(-2) { @Override public Direction getOppositeDirection() { return Direction.WEST; } }, WEST(2) { @Override public Direction getOppositeDirection() { return Direction.EAST; } }; Direction(int code){ this.code=code; } protected int code; public int getCode() { return this.code; } public abstract Direction getOppositeDirection(); }
是的,我们一直这样做。 您返回一个静态实例,而不是一个新的对象
static Direction getOppositeDirection(Direction d){ Direction result = null; if (d != null){ int newCode = -d.getCode(); for (Direction direction : Direction.values()){ if (d.getCode() == newCode){ result = direction; } } } return result; }
public enum Direction { NORTH, EAST, SOUTH, WEST; public Direction getOppositeDirection(){ return Direction.values()[(this.ordinal() + 2) % 4]; } }
枚举有一个静态值方法,该方法返回一个数组,其中包含声明的所有枚举值。 资源
自北得1,EAST得2,SOUTH得3,WEST得4; 你可以创build一个简单的方程来得到相反的结果:
(值+ 2)%4