2015-12-23 7 views
0

Android предоставляет support annotations, и меня особенно интересуют семейные аннотации @StringRes, используемые для обозначения целых параметров таким образом, что вы вынуждены передавать действительные ресурсы вместо любого случайного значения.Как создать аннотацию типа моего ресурса, например @StringRes?

Использование Android Studio, я посмотрел на реализации @StringRes и скопировать его в пользовательском класс моих в моем проекте:

package com.foo.bar.model.db; 

import java.lang.annotation.Documented; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.LOCAL_VARIABLE; 
import static java.lang.annotation.ElementType.METHOD; 
import static java.lang.annotation.ElementType.PARAMETER; 
import static java.lang.annotation.RetentionPolicy.CLASS; 

/** 
* Denotes that an integer parameter, field or method return value is expected 
* to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}). 
*/ 
@Documented 
@Retention(CLASS) 
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE}) 
public @interface IntPk { 
} 

С этой новой @IntPk аннотацией я хочу, чтобы пометить целые поля классов что map database целочисленные внешние ключи в надежде на то, что я не буду смешивать целочисленные значения внешних ключей из разных таблиц/классов (как таковых я бы тогда FooPk, BarPk и т. д. для каждого класса). Однако, когда я пишу такой код:

@IntegerRes int androidValue; 
    androidValue = 42; 
    @IntPk int customValue; 
    customValue = 42; 

Android Студия только подчеркивает androidValue назначение, как показано на скриншоте:

annotation trolling level over 9000

Таким образом, очевидно, что проверка выполняется что-то еще, кроме класса, определяющего аннотацию. Где это происходит? И что еще более важно, как я мог сделать те же проверки для моего настраиваемого @IntPk, как Android SDK для @StringRes и сохранить его в моем проекте для других разработчиков в команде, чтобы иметь тот же уровень дополнительной проверки типов?

+0

Если ваша аннотация не является только аннотацией маркера, то одного аннотации недостаточно ... вам также нужен обработчик аннотации, вероятно, подкласс ['javax.annotation.processing.AbstractProcessor'] (https: //docs.oracle.com/javase/8/docs/api/javax/annotation/processing/AbstractProcessor.html), но это может быть любой класс, который реализует 'javax.annotation.processing.Processor'. Примечание. Я очень мало знаю о написании процессоров аннотаций. – Powerlord

ответ

1

Powerlord правильно, что вам нужно написать обработчик аннотации. Обработчик аннотации будет анализировать ваш исходный код и выдавать предупреждения о несоответствиях между аннотациями и кодом. Вы можете копировать и изменять все, что встроено в Android Studio.

Другая возможность состоит в том, чтобы опираться на инструмент Checker Framework, предназначенный для упрощения написания обработчиков аннотаций. Его Fake Enumeration Checker или его Subtyping Checker могут уже делать то, что вам нужно, или вы можете написать собственный контролер, который будет выполнять ваши правила. Хотя это более выразительное и гибкое решение, недостатком является то, что это не интегрировано в Android Studio.