在Java中使用Enum的序号值来索引数组是不是不好的做法?

2022-09-02 05:28:46

我有两个阵列:墙和邻居。

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 的序数方法?


答案 1

在无关紧要的问题上,最好对邻居使用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
}

答案 2

文档只说大多数程序员对这种方法没有用处。这是合法使用的一个案例。假设您的类同时控制枚举和数组,则没有理由担心为数组编制索引的方法(因为您始终可以使它们保持同步)。ordinal()

但是,如果您的用法变得更加复杂,您可能希望按照建议改用EnumMap