Как писать аннотации, используя несколько типов перечислений? - PullRequest
3 голосов
/ 21 января 2010

Я пытаюсь написать несколько аннотаций, чтобы помочь связать методы тестового примера с различными метаданными. Мои аннотации на данный момент включают BugFix, UseCase и Requirement. Моя конечная цель - написать процессор аннотаций, чтобы отобразить, какие тестовые наборы связаны с отдельными исправлениями ошибок, вариантами использования и требованиями.

Когда я просто реализовывал это для своего собственного проекта, я создавал перечисления, специфичные для моего проекта, для каждой категории тестовой ассоциации. Например, у меня были перечисления ProjectUseCase, которые я мог передать в качестве значения аннотации UseCase в моих методах тестирования. Это позволило легко добавлять дополнительные варианты использования или изменять варианты использования в одном месте.

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

Вот проблемы, с которыми я сталкиваюсь:

  1. Enum нельзя расширять, поэтому у меня не может быть базового перечисления UseCase, которое другие могут расширять для своих собственных проектов.
  2. Значения свойств аннотации должны быть константами. Это не позволяет мне использовать маркер интерфейса (TestAssociation) в моих перечислениях и использовать интерфейс TestAssociation для значений моей аннотации. Кроме того, это не позволяет мне использовать значения String в моей аннотации и передавать имя перечисления при использовании аннотации, например: @UseCase (ProjectUseCase.GENERAL.name ()).

Из того, что я могу сказать, из-за этого мне остается только использовать необработанные строки для значений, что лишает меня безопасности типов и возможности быстрого рефакторинга. Использование классов констант Strings вместо перечислений, кажется, лучший способ справиться с этим, поскольку каждый разработчик может использовать свои собственные.

Единственное, о чем я могу думать, - это ссылаться на класс Enum (или класс констант Strings) и не включать этот класс в jar, предоставляя пользователям возможность его реализовать.

Есть предложения или обходные пути?

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

1 Ответ

2 голосов
/ 21 января 2010

Да.

Единственный хороший выход из этого - разрешить произвольные пользовательские аннотации, чтобы, если мое перечисление было FooEnum, я мог определить FooAnnotation, который его использует. Ваш фреймворк может распознать FooAnnotation как аннотацию, которую он ищет, посмотрев, является ли it мета-аннотированным @UseCase (или как вам угодно)!

...