Доступ к Java hashmap для получения подкласса - PullRequest
0 голосов
/ 26 мая 2019

Я инициализирую одну хэш-карту, которая содержит ключ и объект подкласса.

@Provides
@Singleton
public Map<Locale, XlsxParserBase> getXlsxParserMap() {
    Map<Locale, XlsxParserBase> xlsxParserMap = Maps.newHashMap();
    xlsxParserMap.put(Locale.US, new com.us.XlsxParser()); 
    xlsxParserMap.put(Locale.EU, new com.eu.XlsxParser());
    return xlsxParserMap;
}

Эта карта инициализируется при запуске сервера.Теперь у меня есть класс менеджера, который имеет локаль.Я просто хочу сделать

xlsxParserMap.get(locale).parse();

, где каждый подкласс имеет реализацию синтаксического анализа и использует общие методы из базы.Когда я делаю это, я не могу получить доступ к анализу, потому что метод синтаксического анализа не присутствует в суперклассе.Поскольку карта имеет тип (Locale, XlsxParserBase), я не могу получить доступ к дочерним методам из ссылки XlsxParserBase.

Есть ли более простой способ добиться этого?Я не хочу помещать instanceOf в класс менеджера.Чтобы избежать этого, я подумал об этом подходе карты.Есть ли у экспертов лучший подход к моей проблеме?Дайте мне знать, если мне неясно или вам нужно больше фрагментов.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Создайте интерфейс, который имеет метод parse () (и, возможно, другие), и пусть все подклассы реализуют интерфейс.

Тогда у вас может быть коллекция этого интерфейса, а у класса менеджера может быть метод с этим интерфейсом в качестве параметра

0 голосов
/ 26 мая 2019

Есть несколько возможностей:

  1. добавьте метод parse() к вашему XlsxParserBase и заставьте конкретные классы реализовать / переопределить его в своем методе parse().
  2. идти с отражением. Извлеките метод parse из класса XlsxParserBase в карте и вызовите this. Method method = obj.getClass().getMethod("parse"); method.invoke(obj);.
  3. создать класс-оболочку (например, XlsxParserWrapper), который содержит метод parse(). Этот метод в конкретных реализациях (например, XlsxParserWrapperUS) вызывает базовую конкретную реализацию (например, com.us.XlsxParser().parse()).
  4. хлопот с instanceof
...