Создайте аннотацию @Stub, которая действует как @Deprecated в Java
Я хотел бы создать @Stub
, @Example
или же @Mock
аннотации в Java, чтобы указать, что некоторые классы только для тестирования. Также мне нравится делать эти классы устаревшими, чтобы отговорить пользователей моей библиотеки от их использования. Мне нравится делать что-то похожее на @Nullable
и другие аннотации в JSR305.
Я придумал это:
import javax.annotation.meta.TypeQualifierNickname;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
@Deprecated
@Retention(RetentionPolicy.RUNTIME)
@TypeQualifierNickname
@Target(value=TYPE)
public @interface Stub {
}
И вариант использования:
@Stub
public final class SuperAwesome implements Feature {
}
К сожалению, несмотря на использование @TypeQualifierNickname
швы как у меня @Stub
аннотация помечается как устаревшая Intellij и компилятором javac вместо целевого аннотированного класса.
Есть ли способ, это может работать без необходимости изменений в javac или IDE?
2 ответа
Вам нужно будет написать некоторую логику для обеспечения соблюдения правила программирования, а именно: "не вызывать методы с @Stub
аннотации ". Для этого можно использовать две платформы - http://checkerframework.org/ и подверженные ошибкам.
Недостатком является то, что пользователям вашей библиотеки нужно будет запускать ваш инструмент каждый раз, когда они компилируют ваш код. Вам нужно будет написать инструкции, рассказывающие им, как настроить процесс сборки, чтобы запустить инструмент, проверяющий ваше правило программирования.
Вам нужно будет написать собственный процессор аннотаций в качестве
@Deprecated
аннотация применяется к интерфейсу заглушки, а не к месту ее использования. Я сделал быстрый поиск, но большинство примеров просто распечатывает материал на консоли. Это может помочь
https://deors.wordpress.com/2011/10/08/annotation-processors/