这个枚举查找映射有什么问题?

时间:2011-09-27 23:19:01

标签: java

我有一个枚举,我为它创建的反向查找表为所有值返回null。我在创建查找表后添加了一个断言,当然,它是空的。我觉得这是一个简单而明显的东西,我忽略了因为我对所有的枚举使用了这个完全相同的结构,并且它们工作正常。

public enum TerrainType {
ROAD(1),
PLAINS(2),
FOREST(3),
MOUNTAINS(4);

private static final Map<Byte,TerrainType> lookup = new HashMap<Byte,TerrainType>();

private final byte terrainId;

static {
    for(TerrainType type : EnumSet.allOf(TerrainType.class)) {
        lookup.put(type.getByte(),type);
    }
    assert lookup.get(1) != null; // <--- THIS ASSERT FIRES, WHY?
} 

TerrainType(int id) {
    assert id > 0 && id < 128: "ID must be from 1 to 127"; 
    this.terrainId = (byte) id;
}

public static TerrainType get(int id) {
    return lookup.get(id);
}

public byte getByte() {
    return this.terrainId;
}
}

3 个答案:

答案 0 :(得分:3)

文字1是一个整数。

这很有效。

assert lookup.get(Integer.valueOf(1).byteValue()) != null

或者,您可以将terrainId更改为int

类型

答案 1 :(得分:0)

这对我来说很好。请注意更改。

我建议不要使用assert来强制执行合同。如果您收到意外输入,请抛出IllegalArgumentException

import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

public enum TerrainType
{
    ROAD(1),
    PLAINS(2),
    FOREST(3),
    MOUNTAINS(4);

    private static final Map<Integer, TerrainType> lookup = new HashMap<Integer, TerrainType>();

    private final int terrainId;

    static
    {
        for (TerrainType type : EnumSet.allOf(TerrainType.class))
        {
            lookup.put(type.getTerrainId(), type);
        }
        assert lookup.get(1) != null; // <--- THIS ASSERT FIRES, WHY?
    }

    TerrainType(int id)
    {
        assert id > 0 && id < 128 : "ID must be from 1 to 127";
        this.terrainId = id;
    }

    public static TerrainType lookupById(int id)
    {
        return lookup.get(id);
    }

    public int getTerrainId()
    {
        return this.terrainId;
    }
}

class TerrainTypeDriver {
    public static void main(String[] args)
    {
        for (int i = 0; i < 6; ++i) {
            System.out.println(TerrainType.lookupById(i));
        }
    }
}

答案 2 :(得分:0)

基本上它是等于(对象)的问题。

引用Java API:

“如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null”

试试这段代码:

int a = 1;
byte b = (byte) a;
Byte c = b;
boolean d = c.equals(1);
System.out.println(d);