2012-01-27 3 views
2

У меня есть пакет-частный интерфейс под названием AbstractServer, который предлагает три метода: start(), stop() и init().Уникальный идентификатор для каждого интерфейса-реализации

Для каждого нового сервера я реализую интерфейс и переопределяю эти методы. После этого я зарегистрирую этот новый сервер для своего публичного ServerManager-класса, который собирает все серверы в HashMap и вызывает их выставленные методы в определенном порядке.

Так, начиная все зарегистрированные сервера из где-то в коде просто выглядишь следующим образом:

ServerManager.INSTANCE.startServers(); 

Проблема я в настоящее время сталкиваюсь в том, что я хочу, чтобы иметь возможность удалить сервер из ServerManager s.

Моей идеей было ввести поле public static final String IDENTIFIER в интерфейс и использовать его в качестве ключей в HashMap. Таким образом, чтобы удалить сервер из ServerManager, я хотел бы написать:

ServerManager.INSTANCE.removeServer(HttpServer.IDENTIFIER); 

Проблема заключается в том, что я не могу иметь «абстрактную» атрибут в интерфейсе и, следовательно, не может заставить реализации переопределить Это.

Я также не могу использовать обычный метод (нестатический), потому что конструктор реализаций сервера будет закрытым пакетом.

В качестве альтернативы, я думал об использовании Class из реализаций в качестве ключей в HashMap так что я могу написать что-то вроде этого:

ServerManager.INSTANCE.removeServer(HttpServer.class); 

Любые мысли по этому поводу?

+0

Использование класса в качестве ключа - хороший выбор. – Marcelo

+0

Что вы используете в настоящее время в качестве ключа на своей карте и может быть несколько экземпляров определенного сервера? – quaylar

+0

@quaylar Я использую String, но он нигде не хранится, поэтому вы должны знать точное значение. Мне кажется, как практика биты. –

ответ

2

Если вы знаете, что когда-либо будет один экземпляр для каждого класса реализации, то использование объекта Class в качестве ключа является довольно естественным решением.

Если вы этого не сделаете, то, очевидно, идентификаторы должны быть специфичными для экземпляра, а не для конкретных классов.

+0

Там будет только каждая реализация. –

0

Что об определении перечисления ServerIdentifier для всех возможных серверов-типов и в интерфейсе:

ServerIdentifier getServerIdentifier(); 

Ваша карта может затем стать Map<ServerIdentifier, List<AbstractServer>>, и вы бы даже быть в состоянии управлять несколькими экземплярами одного сервера-Type ...

Преимущества по сравнению с использованием класса-объекта в качестве ключа будет просто более естественным способом борьбы с типами серверов, так как вы можете использовать перечисление и не должны сравнивать Классовые объекты ...

+0

Проблема в том, что мне нужно получить идентификатор (что бы это ни было) статическим способом, поскольку конструктор является закрытым пакетом. Элемент '.class' всегда доступен таким образом, в то время как вы не можете определять статические методы в интерфейсах. –

Смежные вопросы