简体   繁体   中英

How to save enum class in a HashMap?

Let us say we have following enums:

public enum AnimalImages {
TIGER,BEAR,WOLF;
}

public enum CarImages {
BMW,VW,AUDI;
}

Now I want to save these enum classes in a HashMap:

Map<String,Enum<?>> enumMap=new HashMap<String,Enum<?>>();
enumMap.put("AnimalImages",???????);

What I should enter instead of the question marks?

To explicitly answer to your question, you have to put the enum value as this:

Map<String,Enum<?>> enumMap=new HashMap<String,Enum<?>>();
enumMap.put("AnimalImages", AnimalImages.TIGER);

However, if you want to put all the value belonging to an enum, then you could leverage values() method and also change your map to Map<String,Enum<?>[]> so you can use this:

Map<String,Enum<?>[]> enumMap=new HashMap<String,Enum<?>[]>();  // Note Enum<?>[] array
enumMap.put("AnimalImages", AnimalImages.values());
enumMap.put("CarImages", CarImages.values());

Another approach, with a shorten signature can be something like this:

Map<String, Object> enumMap = new HashMap<String,Object>();
enumMap.put("AnimalImages", AnimalImages.values());
enumMap.put("CarImages", CarImages.values());

Another way that bali182 pointed in this comment, you could use:

Map<String, Collection<? extends Enum<?>>> enumMap = new HashMap<>();
enumMap.put("AnimalImages", Arrays.asList(AnimalImages.values()));
enumMap.put("CarImages", Arrays.asList(AnimalImages.values()));

To answer your question:

enumMap.put("AnimalImages", AnimalImages.WOLF);
enumMap.put("Cars", CarImages.AUDI);

But you can also do

Map<String, AnimalImages> enumMap = new HashMap<String, AnimalImages>();

And this way enumMap.get("AnimalImages") , and this way you won't have to type check and cast it.

If the requirement is to create a Map that contains all values of a given enum , I would use a mapping of String keys into EnumSet values:

Map<String, EnumSet<?>> enumMap = new HashMap<String, EnumSet<?>>();
enumMap.put("AnimalImages", EnumSet.allOf(AnimalImages.class));
enumMap.put("CarImages", EnumSet.allOf(CarImages.class));

for (Map.Entry<String, EnumSet<?>> e : enumMap.entrySet()) {
    System.out.println(String.format("key: [%s], values: %s", 
        e.getKey(), e.getValue().toString()));
}

EnumSet is a specialized Set implementation, which is represented internally as a bit vector. Its sole purpose is to provide an efficient and easy way to store enum s.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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