Общий дизайн интерфейса с использованием аннотаций маркеров на перечислениях - PullRequest
1 голос
/ 10 февраля 2011

Можно ли использовать аннотацию маркера для перечисления при разработке универсального интерфейса?
Или, возможно ли ввести контрольные ссылки на аннотации во время компиляции?

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

public interface MessageHandler<E extends Enum<E>> {

    boolean handles( E messageType );
}

Я не хочу, чтобы здесь использовался какой-либо enum, я могу добавить Marker Interface MessageType примерно так,

public interface MessageHandler<E extends Enum<E> & MessageType> {

    boolean handles( E messageType );
}

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

1 Ответ

1 голос
/ 10 февраля 2011

Аннотации используются как XML. Зачем «маркерная аннотация», если интерфейс отлично выражает тип?

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

enum TypeX implements MessageType 
{ 
   X1, 
   X2 
}

class HandlerX extends Handler<TypeX>
    handle(TypeX type)
        if(type==X1) 
        ...

----

class TypeY implements MessageType
{ 
   int x; 
}

class HandlerY extends Handler<TypeY>
     handle(TypeY type)
         if(type.x==0) 
         ...
...