java - 使用 Enum 的序数值来索引 Java 中的数组是不好的做法吗?

标签 java enums

我有两个数组:Walls 和 Neighbors。

public boolean[] walls = new boolean[4];
public Cell[] neighbors = new Cell[4];

我有一个枚举:

enum Dir
{
    North,
    South,
    East,
    West
}

现在,我希望能够通过他们的方向访问墙壁或邻居,所以我不必传递一堆魔法索引。

但是,当我阅读 Enum.ordinal() 的文档时,它说程序员几乎不会使用这种方法,这让我认为它不应该以这种方式使用。

我正在考虑做类似的事情:

    List<Dir> availableDirections = new ArrayList<Dir>();
    for(Dir direction : Dir.values())
        if (!Neighbors[direction.ordinal()].Visited)
            availableDirections.add(direction);

甚至:

return Neighbors[Dir.North.ordinal()];

我应该恢复使用为 NORTH、SOUTH、EAST、WEST 设置索引值的静态常量还是使用 Enum 的序数方法?

最佳答案

在切线问题上,最好为您的邻居使用 EnumMap:

Map<Dir, Cell> neighbours = 
    Collections.synchronizedMap(new EnumMap<Dir, Cell>(Dir.class));

neighbours.put(Dir.North, new Cell());

for (Map.Entry<Dir, Cell> neighbour : neighbours.entrySet()) {
    if (neighbour.isVisited()) { ... }
}

etc..

顺便说一句:枚举实例按照惯例应该全部大写,

enum Dir {
    NORTH,
    EAST, 
    SOUTH,
    WEST
}

关于java - 使用 Enum 的序数值来索引 Java 中的数组是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574580/

相关文章:

java - 在哪里、何时以及如何将 DTO 转换为实体/从实体转换

java - 如何在Enum中实例化内部类?

java - 链接到 Javadoc 中的枚举成员

typescript - TypeScript 是否允许将枚举分配给接口(interface)的对象键?

java - 如何在 Java 的枚举中保存图像?

java - 我如何知道瓦丁的 window 是否打开?

c# - 带有 Type 变量的 Cast<T>()

Swift 枚举超出范围

java - JSF POST 不带 "confirm for resubmision"

java - 初始化 List<E> 数组时抛出 IndexofBoundsException