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

Java 为每个枚举实例分配一个不断增长的ID,java,enums,static-variables,Java,Enums,Static Variables,我刚刚开始使用Java的第一步,学习了所有的基础知识,但随后发现我需要的枚举存在问题,请原谅,如果我的问题的解决方案非常明显: 因此,我得到了这个枚举,并希望为从0开始计数的每个实例添加一个唯一的id,但不必为每个构造函数调用添加另一个参数(因为这以后可能会导致ofc错误) 我想加一个 static int nextID = 0; 并将构造函数编辑为 private TerrainTile(int moveCost) { this.id = nextID++; this.mov

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

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

我想加一个

static int nextID = 0;
并将构造函数编辑为

private TerrainTile(int moveCost) {
    this.id = nextID++;
    this.moveCost = moveCost;
}
但是我得到一个错误消息,它不能引用初始化器中的静态字段

有什么解决方法吗?

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

请注意: 通过调用
.values()[index]

例如:

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

听起来好像您正在尝试将类功能组合到枚举中。我会特别小心枚举声明中的非最终、非静态成员字段。通过使用TerrainTile类(如果您真正想要每个类型的单个实例行为,则可能是一个实例)和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);
    }

    ...
}
public class TerrainTile{
公共枚举类型{
水(1)、草地(1)、丘陵(2)、福里斯特(2)、空白(-1);
公共最终搬迁成本;
私人地衣(成本){
this.MOVE_COST=移动成本;
}
公共布尔值isTraversable(){
返回(移动成本>0);
}
}
私有最终类型;
私有最终图像纹理;
...
私人陶土(类型){
this.type=type;
}
私有静态最终贴图分幅=新EnumMap();
静止的{
//为每种类型实例化一个TerrainTile并存储到tiles地图中
对于(类型:Type.values()){
//最后,在此步骤中还将加载平铺纹理或设置颜色
瓷砖。铺(型,新陶土(型));
}
}
公共静态TerrainTile getTile(类型){
//返回对此类型的Terraintle的引用
返回瓷砖。获取(类型);
}
...
}
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);
    }

    ...
}