Работа с перечислениями, реализующими общий интерфейс (итерация, десериализация) - PullRequest
4 голосов
/ 18 ноября 2011

У меня есть приложение для Android, которое загружает данные из веб-источников и отображает их.Я организовал каждый метод API, поддерживаемый этими источниками, в константах enum, разделенных на источники.Допустим, SourceA предоставляет данные о спорте и погоде, а SourceB предоставляет данные о запасах и новостях.

public enum ServiceA implements ServiceMethod {
    GET_SPORT(...) {...}, 
    GET_WEATHER(...) {...};
    ...
}

public enum ServiceB implements ServiceMethod {
    GET_STOCK(...) {...}, 
    GET_NEWS(...) {...};
    ...
}

В каждом классе enum также есть частные члены для работы с API сервиса (разные API для разных источников)

И переменная ServiceMethod

ServiceMethod method;
... // initializing
String cleanAndFancyData = method.queryData(); // e.g.

Нет, мне нужно хранить историю пользователей, поэтому я должен сериализовать и десериализовать переменную ServiceMethod, а также перечислить все константы из всех перечислений, реализующих этот интерфейс.Сериализация выглядит просто и не подлежит сомнению.

Теперь я просто вручную перебираю перечисления:

Collection<ServiceMethod> allMethods = new ArrayList<ServiceMethod>();
allMethods.addAll(EnumSet.allOf(ServiceA.class));
allMethods.addAll(EnumSet.allOf(ServiceB.class));

Есть ли более чистый и приятный способ для этого?Или мой подход совершенно неверный?Кроме того, есть ли способ гарантировать, что все ServiceMethod имеют уникальные имена (для всех перечислений)?

1 Ответ

1 голос
/ 18 ноября 2011

Вы можете использовать шаблон стратегии для объединения ServiceA и ServiceB в один Service.

...