аннотации на уровне класса и интерфейсы - PullRequest
7 голосов
/ 10 февраля 2010

Я смотрю на некоторый код, в котором аннотации на уровне класса используются для «добавления» свойств к определенным классам, а затем с помощью отражения эти свойства доступны и используются.

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

1 Ответ

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

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

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

Вы можете иметь:

interface CrudDao<T> {
   Serializable create(T t);
   T read(Serializable id);
   void update(T t);
   void delete(T t);
}

Это будет громоздкий контракт для реализации, и, скорее всего, возникнет какая-то цепочка методов.

Вместо этого вы можете сделать что-то вроде:

class SomeDao {

   @Create
   long create(SomeEntity e) { // code }

   @Read
   SomeEntity read(long id) { // code }

   @Update
   void update(SomeEntity e) { // code }

   @Delete
   void delete(SomeEntity e) { // code }
}

Недостатком является то, что было бы неудобно использовать:

class CrudFactory {
    long create(Class clazz, Object obj) {
       // loop through methods
       // find method with @Create
       // call method
    }    
}

Аннотации в этом примере были бы излишними в большинстве случаев, ИМО. Есть что-то, что можно сказать о четко определенном, хорошо документированном контракте.

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