我需要保留一个映射,该映射查找给定String的一些属性。对于下面这样的示例,我需要根据该动物的描述获取该动物的可能颜色。我有“四脚动物”-不是“ CAT”-并且需要找到布朗和灰色。
将其保留在枚举中可使代码更易于维护和易于阅读,但每次我尝试查找颜色时遍历所有枚举值都会产生额外的开销。
而且,每当我需要获取颜色列表时,都会创建一个新的数组。
我的问题是,这些额外费用会分别影响20左右大小的Animal枚举和String设置(已提供映射说明)的性能吗?还想知道JVM是否优化了这些Arrays.asList调用。
或您建议使用的任何其他设计解决方案?
如果您能推荐一个来源来阅读更多有关这些性能问题的信息,那将是不胜感激。
谢谢!
public enum AnimalsEnum{
CAT("An animal with four legs"){
@Override
public List<ColorsEnum> getPossibleColors(){
return Arrays.asList(BROWN, GREY);
}
},
BIRD("An animal with two legs and two wings"){
@Override
public List<ColorsEnum> getPossibleColors(){
return Arrays.asList(GREY, YELLOW, ORANGE);
};
};
public List<ColorsEnum> getPossibleColors(){
throw new AbstractMethodError();
};
}
public enum ColorsEnum{
ORANGE, BLUE, GREY, BROWN, YELLOW;
}
答案 0 :(得分:4)
关于您的疑问“而且每当我需要获取颜色列表时,都会创建一个新的数组”,您可以尝试以下操作:
public enum AnimalsEnum
{
CAT("An animal with four legs",
EnumSet.of(ColorsEnum.BROWN, ColorsEnum.GREY)),
BIRD("An animal with two legs and two wings",
EnumSet.of(ColorsEnum.GREY, ColorsEnum.YELLOW, ColorsEnum.ORANGE));
private AnimalsEnum(String description,
EnumSet<ColorsEnum> possible_colors)
{
this.description = description;
this.possible_colors = possible_colors;
}
public String getDescription()
{
return description;
}
public EnumSet<ColorsEnum> getPossibleColors()
{
return (possible_colors);
}
public static AnimalsEnum getAnimal(String description)
{
return (descr_map.get(description));
}
private String description;
private EnumSet<ColorsEnum> possible_colors;
private static HashMap<String, AnimalsEnum> descr_map;
static
{
descr_map = new HashMap<String, AnimalsEnum>();
for (AnimalsEnum animal : values())
{
descr_map.put(animal.getDescription(), animal);
}
}
} // enum AnimalsEnum
编辑:
修改了答案,添加了一个静态方法,该方法返回与其描述相对应的动物。
EDIT2:
如果您不想为动物单独饲养Enum
,则可以尝试以下方法:
public class AnimalColors extends HashMap<String, EnumSet<ColorsEnum>>
{
private AnimalColors()
{
put("An animal with four legs", EnumSet.of(ColorsEnum.BROWN, ColorsEnum.GREY));
put("An animal with two legs and two wings", EnumSet.of(ColorsEnum.GREY, ColorsEnum.YELLOW, ColorsEnum.ORANGE));
}
public static AnimalColors get()
{
return my_instance;
}
private static AnimalColors my_instance = new AnimalColors();
} // class AnimalColors
这仅仅是基于意见的。由你决定。