繁体   English   中英

如何在Java中使用map作为字段创建枚举?

[英]How to create an enum with map as a field in Java?

我需要在Java中创建一个具有Map类型字段的枚举。 如何初始化地图字段? 有没有不创建匿名对象或使用Guava(或类似)库的方法?

public enum Day {
  Sunday(new HashMap<>()); // TODO initialize the map

  private Map<String, String> map;

  Day(Map<String, String> paramMap) {
    this.map.putAll(paramMap);
  }

  public getMap() {return map;}
}

由于映射的键和值均为String ,您可以使构造函数采用varargs并让其为您构建映射:

public enum Day {
    SUNDAY("Foo", "Fooz",
           "Bar", "Barz",
           "Hello", "Hi");

    private final Map<String, String> map;

    Day(String... keysAndValues) {
        if ((keysAndValues.length & 1) != 0)
            throw new IllegalArgumentException("keysAndValues has odd size: " + Arrays.toString(keysAndValues));
        this.map = new HashMap<>();
        for (int i = 0; i < keysAndValues.length; i += 2) {
            if (keysAndValues[i] == null || keysAndValues[i + 1] == null)
                throw new NullPointerException();
            if (this.map.put(keysAndValues[i], keysAndValues[i + 1]) != null)
                throw new IllegalArgumentException("keysAndValues has duplicate key named '" + keysAndValues[i] + "': " + Arrays.toString(keysAndValues));
        }
    }

    public Map<String, String> getMap() {
        return this.map;
    }

}

如果您打印SUNDAY的地图,例如System.out.println(Day.SUNDAY.getMap()) ,则会得到:

{Bar=Barz, Hello=Hi, Foo=Fooz}

这就是可以使用jdk8并使用功能接口来完成的方法

import java.util.Map;

public interface MapProducer<K,V> {

  Map<K,V> getMap();

}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public enum EnumWithMap {
    //empty map
    TEST1(HashMap::new),
    //default map
    TEST2(EnumWithMap::getDefMap),
    //enum instance map
    TEST3(()->{
        Map<String,String> map = new HashMap<>();
        map.put("key1","val1");
        return map;
    })
    ;

    private final Map<String,String> map;

    EnumWithMap(MapProducer<String,String> mapProducer) {
        this.map = Collections.unmodifiableMap(mapProducer.getMap());
    }

    private static Map<String,String> getDefMap(){
        Map<String,String> map = new HashMap<>();
        map.put("keyDef","valDef");
        return Collections.unmodifiableMap(map);
    }

    public Map<String, String> getMap() {
        return map;
    }
}

$ foreach循环的结果:

for(EnumWithMap en:EnumWithMap.values())System.out.println(en.getMap()); 

将会:

{}
{keyDef=valDef}
{key1=val1}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM