2011-09-27 40 views
1

我有一個枚舉,我爲其創建的反向查找表爲所有值返回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; 
} 
} 
+0

您的地圖使用字節,而你的地圖(斷言表達式)試圖使用整數 –

+0

因爲lookup.get(1 )返回ROAD,它不爲空。 – duffymo

回答

3

字面值1是一個整數。

This Works。

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

或者,你可以改變你的terrainIdint

+0

就是這樣。我的其他大多數枚舉都是整數。 – justkevin

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)); 
     } 
    } 
} 
0

基本上它是等於(對象)的問題。

引用的Java API:

「如果此映射包含從鍵k到值v的映射,使得(?鍵== 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);