我刚刚开始使用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;
}
但是我收到一条错误消息,指出它无法引用初始化程序中的静态字段。
有解决方法吗?
答案 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);
}
...
}