java - 实现响应式方向枚举的最简单方法? java

标签 java enums direction

我会以“最清晰”的方式快速展示我想要实现的目标:

public enum Orientation {
    NORTH, WEST, SOUTH, EAST }

public enum Turn {
    LEFT, RIGHT }

所以我希望这两个枚举做的是安全并有效地根据移动查找更改后的方向:

Orientation orient = Orientation.NORTH;
// orient points to NORTH now
orient = orient.turn(Turn.LEFT);
// orient points to WEST now

我尝试实现此目标的第一种方法是创建 map :

 EnumMap<Orientation, EnumMap<Turn, Orientation>>

静态映射所有方向,但这是 map.get.put.get 的一大块......并且可能有点过量,尽管导致了这种预期的效果:

directionMap.get(NORTH).get(LEFT)
// the value would then be WEST

我的下一个方法是通过一个 Compass 类,将所有方向链接成一个圆圈。像 LinkedCircuitList 一样工作...<->NORTH<->EAST<->SOUTH<->WEST<->NORTH< ->... 所以 Compass 可以有一个静态函数,调用该链表的任何成员并向左或向右移动,从而导致正确的方向改变。但代码并没有真正按照我想要的方式工作。

最后我的问题是,是否有人有此类代码的经验,或者知道如何以良好的枚举方式实现所需的结果?

最佳答案

我认为 map 解决方案没有任何问题。如果你想要更简洁的东西:

public enum Orientation {
    NORTH, EAST, SOUTH, WEST;

    private static Orientation[] vals = values();

    Orientation turnTo(Turn t) {
        return vals[(4 + this.ordinal() + (t == Turn.RIGHT ? 1 : -1)) % 4];
    }
}

然而,这不太干净和可维护(如果有人改变枚举的顺序,它就会崩溃)。

稍微干净一点(但不太简洁):

public enum Orientation {
    NORTH(0), EAST(1), SOUTH(2), WEST(3);

    private final int p;

    Orientation(int p) {
        this.p = p;
    }

    private static Orientation[] vals = new Orientation[4];
    static {
        for( Orientation o : Orientation.values() )
            vals[o.p] = o;
    }

    Orientation turnTo(Turn t) {
        return vals[(4 + this.p + (t == Turn.RIGHT ? 1 : -1)) % 4];
    }
}

关于java - 实现响应式方向枚举的最简单方法? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040567/

相关文章:

java - Android 本地化查询

java - 如何处理基于枚举的开关中的默认情况?

c++ - 两个具有相同值的枚举,如何访问它们?

javascript - 如何将网页的方向更改为阿拉伯语、希伯来语的 RTL?

java - 使用 XOM xml 库时,DTD 工厂类 org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl 不会从 DTDDVFactory 扩展

java - 内容解析器 - 添加新的非本地日历 - 进程结束时删除日历

java - 枚举的子类

java - 如何将物体缓慢平移到某个位置(以便可以看到)

c# - 如何从相对方向确定 360° 角?

java - Android - 如何使用 okhttp-retrofit 从保存的缓存中使特定 URL 无效/删除?