2012-05-11 1 views
2

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

public interface IDbTable extends Serializable 
{ 
    public int getId(); 
} 

мне нужно обязывать все классы, которые реализуют IDbTable, чтобы иметь аннотацию «@DatabaseTable» и, по меньшей мере, одно поле внутри класса, которые имеют «@DatabaseField». Единственный способ реализации IDbTable должно быть так:

@DatabaseTable(tableName = "Something") 
public static class TestTable implements IDbTable 
{ 
      @DatabaseField 
      public int id; 

    public int getId() 
    { 
     return id; 
    } 
} 

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

+0

Сверху моей головы подход к тестированию единиц измерения - это лучшее, что приходит на ум. – NPE

+0

Нет способа сделать это требование порождающим ошибку? Без проведения единичных тестов? Элемент тестирования устройства кажется большим обходным решением для меня – Stew

+0

Можно проверить его во время выполнения, подходит ли он вам? –

ответ

2

Вы не можете применить аннотации к интерфейсу, который будет наследоваться реализующего класса, в соответствии с Java документации: http://docs.oracle.com/javase/6/docs/api/java/lang/annotation/Inherited.html

Указывает, что тип аннотации автоматически передается по наследству. Если в объявлении аннотации присутствует аннотация аннотации , пользователь запрашивает тип аннотации в объявлении класса , а объявление класса не имеет аннотации для этого типа , тогда суперкласс класса будет автоматически запрашиваться для тип аннотации. Этот процесс будет повторяться до тех пор, пока не будет найден аннотация для этого типа, или верхняя часть иерархии классов (Object) будет равна . Если суперкласс не имеет аннотации для этого типа, то запрос будет указывать, что этот класс не имеет такой аннотации.

Обратите внимание, что этот тип мета-аннотации не действует, если аннотированный тип используется для аннотирования чего-либо иного, кроме класса. Также обратите внимание, что эта мета-аннотация только вызывает наследование аннотаций от суперклассов; аннотации на реализованные интерфейсы не влияют.

+0

Но см. Http://fusionsoft-online.com/press-releases-java-annotations.php для библиотеки, которая говорит, что позволяет наследовать аннотации для интерфейсов. – Shawn

0

Почему вы не используете обработку аннотаций, чтобы проверить, что требуемая аннотация присутствует в вашем классе, когда она отправляется в вашу инфраструктуру или во время сборки/развертывания.

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