为每个枚举实例分配不断增长的ID

时间:2014-07-09 02:40:16

标签: java enums static-variables

我刚刚开始使用Java的第一步,学习了所有的基础知识,但后来发现了我需要的枚举问题,所以请原谅我,如果我的问题的解决方案非常明显:

所以我得到了这个枚举,并希望为每个实例添加一个唯一的id,从0开始向上计数,但不必为每个构造函数调用添加另一个参数(因为这可能导致以后的错误)。

public enum TerrainTile{

 WATER(1), GRASSLAND(1), HILL(2), FORREST(2), BLANK(99);

private final int id;
private final int moveCost;
private boolean hidden = true;

private TerrainTile(int moveCost) {
    this.moveCost = moveCost;
}

我想要添加一个

static int nextID = 0;

并将构造函数编辑为

private TerrainTile(int moveCost) {
    this.id = nextID++;
    this.moveCost = moveCost;
}

但是我收到一条错误消息,指出它无法引用初始化程序中的静态字段。

有解决方法吗?

2 个答案:

答案 0 :(得分:5)

您可以使用ordinal()方法。它基于在源代码中声明成员的顺序,并从零开始计算。所以我想,正是你需要的。

请注意: 您可以通过拨打.values()[index]

从序号中获取原始枚举成员

示例:

int hillOrdinal = TerrainTile.HILL.ordinal(); // 2
TerrainTile hill = TerrainTile.values()[hillOrdinal];

答案 1 :(得分:0)

听起来您正在尝试将功能组合到枚举中。我会特别警惕枚举声明中的非final,非静态成员字段。您想要的行为似乎最好通过使用TerrainTile类(如果您真的需要单实例每类型行为可能是flyweight)和TerrainTileType(或TerrainTile.Type)枚举来实现。像这样:

public class TerrainTile {
    public enum Type {
        WATER(1), GRASSLAND(1), HILL(2), FORREST(2), BLANK(-1);
        public final int MOVE_COST;
        private TerrainTile(int moveCost) {
            this.MOVE_COST = moveCost;
        }
        public boolean isTraversable() {
            return (MOVE_COST > 0);
        }
    }

    private final Type type;
    private final Image texture;
    ...
    private TerrainTile(Type type) {
        this.type = type;
    }

    private static final Map<Type, TerrainTile> tiles = new EnumMap<>();
    static {
        // instantiate one TerrainTile for each type and store into the tiles Map
        for (Type type: Type.values()) {
            // Eventually, also load tile textures or set Color in this step
            tiles.put(type, new TerrainTile(type));
        }
    }

    public static TerrainTile getTile(Type type) {
        // return the reference to the TerrainTile of this type
        return tiles.get(type);
    }

    ...
}