使用地图与枚举

时间:2019-03-22 12:29:28

标签: java performance oop enums


我需要保留一个映射,该映射查找给定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;
}

1 个答案:

答案 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

这仅仅是基于意见的。由你决定。