используя карту против Enum - PullRequest
1 голос
/ 22 марта 2019


Мне нужно сохранить отображение, которое находит некоторые свойства с учетом строки.Для примера, подобного приведенному ниже, мне нужно получить возможные цвета для животного, учитывая описание этого животного.У меня есть «животное с четырьмя ногами», а не «кошка», и мне нужно найти коричневого и серого.
Сохранение этого в перечислении делает код более удобным и легким для чтения, но это требует дополнительных затрат при обходе всех значений перечисления каждый раз, когда я пытаюсь найти цвета.А также каждый раз, когда мне нужно получить список цветов, создается новый массив.
Мой вопрос заключается в том, насколько эти дополнительные затраты влияют на производительность для наборов Animal enum и String (описания, которые я дал для сопоставления) размером около 20 каждый?Также интересно, оптимизирует ли 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 Ответ

4 голосов
/ 22 марта 2019

Что касается ваших сомнений "А также каждый раз, когда мне нужно получить список цветов, создается новый массив", вы можете попробовать следующее:

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

EDIT:
Изменен ответ, добавлен статический метод, который возвращает животное, соответствующее его описанию.

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

Это просто на основе мнения.Вам решать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...