Принудительно отображать конкретные классы общего интерфейса в статической карте - PullRequest
2 голосов
/ 09 января 2011

Допустим, у меня есть класс enum - ConfigElement, в котором есть некоторые члены, такие как GENERAL_CONFIG("General Configuration"), TRANSIT_TIMES("Transit times").

Все отдельные классы этих элементов конфигурации реализуют общий интерфейс ConfigElementOP,например

public class TransitTimesOp implements ConfigElementsOp{
    //implementation of interface methods
}

Эти отдельные классы определяют определенное поведение, которое является для них специфичным.

Теперь контроллер приложения просто получает конкретный ConfigElement, а затем с помощьюфабрики, находит класс, который имеет соответствующее поведение, и использует его соответствующим образом.

В настоящее время моя фабрика представляет собой просто статическую карту между ConfigElement и ее классом поведения, как

public static Map<ConfigElement, ConfigElementsOp> ConfigElementBehaviourMap = 
    new HashMap<ConfigElement, ConfigElementsOp>();

ConfigElementBehaviourMap.put(ConfigElement.TRANSIT_TIMES, TransitTimesOp.class);
...

У меня есть две проблемы с этим:

  1. Это правильный дизайн для фабрики?Мне кажется это более сложным, так как добавление любого нового элемента и поведения потребовало бы изменений во многих местах, и пропущение для включения его в эту статическую карту будет игнорироваться компилятором.

  2. Допустим, мы идем с этим проектом фабрики (статическая карта), есть ли способ обеспечить, чтобы любой новый класс, определенный для элемента конфигурации, делал запись в эту карту.И любой такой промах будет ошибкой во время компиляции.

Использование можно описать следующим образом - для различных контроллеров потребуется различная поведенческая карта этого перечисления.Итак, допустим - у контроллера пользовательского интерфейса будет одна карта, в которой указано, как отображать конкретный элемент ConfigElement, в распоряжении Serializer будет другая карта, представляющая собой карту между ConfigElement и его конкретным сериализатором.Отдельные контроллеры, находясь в работе, получат соответствующее поведение для ConfigElement со своей карты и будут его использовать.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 09 января 2011

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

0 голосов
/ 09 января 2011

Прежде всего, поскольку ключ - это enum, вам, вероятно, следует использовать EnumMap, который специально для этого случая.

Статическая карта, вероятно, будет работать за счет введения сильной зависимости между классом, содержащим карту, и реализациями ConfigElementOp.

Что такое большая картинка , как вы собираетесь использовать Map?

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