Использование перечисления Java в картах - PullRequest
0 голосов
/ 02 февраля 2019

Итак, я делаю проект и получил пять разных классов:

public class Article { ... } 

public class Shirt extends Article { ... } 

public class Boots extends Article { ... } 

...

Могу ли я сделать что-то вроде

public enum Articletype {
    Shirt, Boots, ...
}

И использовать эти перечисления на карте, например

Map<Integer,Articletype> testMap = new HashMap<Integer,Articletype>();

Как мне подойти к этому?

У меня уже есть карта, которая сохраняет "Рубашку" - объекты типа

Map<Integer,Shirt> shirts = new HashMap<>()

Я пробовал что-то вроде

Map<Integer,Articletype> testMap = new HashMap<Integer,Articletype>();
testMap.put(1,shirts.get(1001));

Но это не работает.Я не думаю, что полностью понимаю эти типы перечислений, но я знаю, что вы можете использовать их вот так (или я ошибаюсь?).

В любом случае, я хочу использовать их чаще, и я надеюсь, что кто-то может принести ихкакой-то свет в этой тьме.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Нет места для перечислений в контексте вашего testMap.То, что вы хотите сохранить на карте, это объекты типов, которые расширяются Article.Использование Map<Integer, Articletype> не имеет большого смысла, потому что вы не отображаете типы статей в целые числа, а статьи в целые числа.


Был бы правильный случай использования перечислений, если бы вам, например, пришлось группироватьвсе статьи по типам:

Map<ArticleType, List<? extends Article>> articlesByType = new HashMap<>();
List<Boot> bootList = ...
articlesByType.put(ArticleType.BOOT, bootList);
0 голосов
/ 02 февраля 2019

Вы можете использовать перечисления таким образом - это означает, что вы в основном заменяете текущий тип представления int на более выразительный enum IIUC, но имейте в виду, что он имеет тот недостаток, что он менее гибок при добавлении новых типов статей.На самом деле возникает вопрос, является ли хорошей идеей использовать в этом случае.

Что вы можете сделать, так это сохранить Map<ArticleType, List<Article>>, который будет содержать все статьи данного типа, например,

List<Article> allArticles = ...
Map<ArticleType, List<Article>> grouped = new HashMap<ArticleType,List<Article>>();
for (Article a : allArticles) {
    List<Article> ofType = grouped.computeIfAbsent(a.getArticleType(), ArrayList::new);
    ofType.add(a);
}
// and then you get all shirts by
List<Article> shirts = grouped.get(ArticleType.Shirt);

Обратите внимание, что в Java 8 это можно сделать короче, используя потоки

Map<ArticleType,List<Article>> bytype = allArticles.stream()
    .collect(Collectors.groupBy(Article::getType));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...