Java 枚举方法 - 返回相反方向枚举

2022-08-31 09:12:08

我想声明一个枚举方向,它有一个返回相反方向的方法(下面的语法不正确,即枚举无法实例化,但它说明了我的观点)。这在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);
     }
}

答案 1

对于那些被标题引诱到这里的人:是的,你可以在枚举中定义自己的方法。如果您想知道如何调用此类非静态方法,则可以像使用任何其他非静态方法一样执行此操作 - 在定义或继承该方法的类型实例上调用它。在枚举的情况下,这些实例只是s。ENUM_CONSTANT

所以你所需要的只是.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


这里有一些更“黑客”的方式来说明@jedwards注释,但它并不像第一种方法那样灵活,因为添加更多字段或更改它们的顺序会破坏我们的代码。

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

答案 2

对于像这样的小枚举,我发现最可读的解决方案是:

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();

}