Java:必须放弃使用枚举作为HashMaps的键,为什么使用枚举键的HashMap.get()会返回null指针


enum MyKeys { AKEY, BKEY, CKEY } 
Map <MyKeys, Clazz> zzz = new HashMap<MyKeys, Clazz>();
zzz.put(MyKeys.BKEY, new Clazz());
zzz.get(MyKeys.BKEY).setValues(someValues);
Clazz xxx = zzz.get(MyKeys.BKEY);//returns null  

然而,这个简单的更改使其返回正确的值:

enum MyKeys { AKEY, BKEY, CKEY } 
Map <String, Clazz> zzz = new HashMap<String, Clazz>();
zzz.put(MyKeys.BKEY, new Clazz());
zzz.get(MyKeys.BKEY).setValues(someValues);
Clazz xxx = zzz.get(MyKeys.BKEY.toString());//doesn't returns null  

为什么?

Map <MyKeys, Clazz> zzz = new HashMap<MyKeys, String>();
// this means it won't return null, the value is initialized
zzz.put(MyKeys.BKEY, new Clazz()); 
// this is confusing part ... somevalues might be null
zzz.get(MyKeys.BKEY).setValues(someValues);
Clazz xxx = zzz.get(MyKeys.BKEY); //definitely won't return null

你确定是hashmap返回null,而不是放入hashmap的clazz的getValues((的结果吗。

如果你在其他地方有错误,请在基于web的编译器中尝试以下操作:

import java.util.HashMap;
import java.util.Map;
public class HelloWorld{
    public static class Clazz {
        public String val;
        public void setValues(String someValues){
            val=someValues;
        }
    }
    public enum MyKeys { AKEY, BKEY, CKEY; }
    public static void main(String[] args ){
        Map<MyKeys, Clazz> zzz = new HashMap<MyKeys, Clazz>();
        // this means it won't return null, the value is initialized
        zzz.put(MyKeys.BKEY, new Clazz());
        // this is confusing part ... somevalues might be null
        zzz.get(MyKeys.BKEY).setValues("someValues");
        Clazz xxx = zzz.get(MyKeys.BKEY);
        System.out.println(xxx.val);
    }
}

如果使用,您将获得正确的值

String xxx = zzz.get(MyKeys.BKEY);

因此,在方法参数中使用BKEY之前,实际上需要将其声明为MyKeys的枚举。

我使用过java的EnumMap

参见此示例:

public enum Colors{
    BLUE, YELLOW, BROWN, RED;
}

然后启动EnumMap

// initialization
EnumMap<Colors, String> stateMap = new EnumMap<Colors, String>(Colors.class);

享受吧!

最新更新