Создайте аннотацию Java с контекстным поведением IDE

Я создал аннотацию

/**
 * Highlights this method is declared in XML
 */
public @interface FromXML {
}

Я использую это в методах, которые выглядят так:

@FromXML
public void onSomethingClick(View v){

}

Переменная v необходима системе отражения Android для вызова этого метода. Однако входная переменная v не используется, поэтому моя IDE предупреждает меня об этом. Мне нравится это предупреждение, и я хочу, чтобы оно оставалось на всю оставшуюся часть моего кода.

введите описание изображения здесь

Чтобы скрыть предупреждение, я мог бы сделать

@SuppressWarnings("unused")
@FromXML
public void onSomethingClick(View v){

}

или я мог бы добавить тег параметра

Но я бы предпочел, чтобы IDE (eclipse) читала мою аннотацию @FromXML и не выдавала мне предупреждения.

Я знаю, что нельзя расширить аннотацию, но в основном это то, чем я хочу заниматься.

Есть ли способ добавить мою аннотацию, которая будет распознана как 'подавить аннотацию предупреждений.

or

Есть ли способ закодировать мою аннотацию, чтобы она подавляла предупреждения?


person Blundell    schedule 26.11.2012    source источник
comment
Я не уверен, но думаю, что эта статья: Technicalmumbojumbo.wordpress .com / 2008/01/13 / есть решение, кое-что о @Retention   -  person eric.itzhak    schedule 28.11.2012
comment
Ваша пользовательская аннотация и параметр "v" не имеют ничего общего друг с другом. Не запутайтесь, заставляя вашу пользовательскую аннотацию действовать как аннотация подавления предупреждений ». С точки зрения языковой области, IDE очень правильно предупреждает вас о неиспользуемом параметре, потому что один или несколько входящих данных игнорируются.   -  person gyorgyabraham    schedule 28.11.2012
comment
@gyabraham Я использую аннотацию в тех местах, где у меня будет только одна входная переменная для метода. Поэтому я очень хочу, чтобы они имели дело друг с другом. (Если у него было 0 или более 1 вар, это потенциально могло привести к ошибке).   -  person Blundell    schedule 28.11.2012
comment
Я понимаю вашу проблему. Сигнатуры ваших методов должны соответствовать спецификациям Android, в противном случае произойдет сбой. (на самом деле не использовать параметр - это другой вопрос). Вы должны включать аннотацию suppresswarnings каждый раз, вы ничего не можете сделать лучше, потому что Google форсирует эту странную конструкцию.   -  person gyorgyabraham    schedule 29.11.2012
comment
@Blundell Android Lint уже проверяет, имеет ли атрибут android:onClick в определении макета правильное имя метода, которое присутствует в действии, которое использует этот макет.   -  person MeTTeO    schedule 04.12.2012
comment
@MeTTeO да, сейчас ... он все еще не выделяется в Activity, поэтому метод существует   -  person Blundell    schedule 04.12.2012


Ответы (3)


Вы всегда можете создать плагин для Eclipse, который будет сканировать источник и находить эти аннотации в вашем случае @FromXML и добавлять дополнительную аннотацию в вашем случае @SuppressWarnings.

Вы можете создать для него команду, и когда эта команда будет запущена, вы запустите этот плагин.

Создание подключаемого модуля Eclipse

Надеюсь это поможет.

ОБНОВЛЕНИЕ - С ПОМОЩЬЮ ЭТОГО НЕВОЗМОЖНО СДЕЛАТЬ ГЛУБИНУ (ПОПРОБОВАЛОСЬ):

Или с помощью AspectJ для удаления предупреждений Добавление предупреждений в Eclipse с помощью AspectJ < / а>

В этом руководстве используется AspectJ для добавления предупреждений в eclipse, если разработчик использует System.out.println() в коде. Таким образом, можно сделать обратное, чтобы удалить предупреждение при наличии аннотации.

ОБНОВЛЕНИЕ 2: в Eclipse есть способ создать пользовательский обработчик аннотаций или отредактировать объединенный обработчик аннотаций (который генерирует предупреждение о неиспользуемой переменной). Так что придется настроить этот процессор по своему усмотрению.

Некоторые отличные ссылки:

Руководства по разработке процессора аннотаций Eclipse

Инструменты разработки Java - Инструменты обработки аннотаций

person Narendra Pathai    schedule 30.11.2012
comment
Я бы не хотел, чтобы плагин менял мой исходный код. Я бы хотел, чтобы плагин заметил мою аннотацию и не выдавал предупреждения. Было бы неплохо привести пример этого. - person Blundell; 05.12.2012
comment
Это некоторые ссылки на руководства по разработке процессоров Eclipse Annotation, которые должны нам помочь. Попытка настроить код связанного процессора аннотаций с eclipse. - person Narendra Pathai; 05.12.2012
comment
Пройден через связанный процессор аннотаций с eclipse, и кажется, что изменение некоторых классов поможет! Вам нужно будет проверить источник APT для eclipse, используя ссылку выше. Затем измените некоторые классы, которые, как мне кажется, необходимы для работы требований, снова создайте APT и замените его старым. Я делаю то же самое, но нужно время, чтобы привыкнуть. Выглядит определенно возможным! - person Narendra Pathai; 06.12.2012

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

FromXML.java:

public @interface FromXML {
}

MyInterface.java:

public interface MyInterface {
    @FromXML
    public void onSomethingClick(View v);
}

MyClass.java

public MyClass implements MyInterface {

    @Override
    @FromXML
    public void onSomethingClick(View v){
    }
}

РЕДАКТИРОВАТЬ: Другим решением может быть определение вашего метода как абстрактного. В самом деле, насколько я понимаю ваш код, ваши методы - это просто объявление (реализации находятся в файле XML). Итак, ваша проблема скорее проблема дизайна, чем проблема IDE (ваша IDE как раз права насчет предупреждения). На самом деле ваш метод абстрактен и определен где-то еще.

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

public abstract class MyClassUsingOnSomethingClick {

/*
 * All the class implementation can be here as the normal class.
 */

    @FromXML
    public abstract void onSomethingClick(View v);

}

Я знаю, вы скажете, что это решение делает невозможным легкое создание объекта, но тогда у вас будет два решения:

1 - Создайте свои объекты встроенными:

MyClassUsingOnSomethingClick a = new MyClassUsingOnSomethingClick() {
    @Override
    @FromXML
    public void onSomethingClick(View v) {}
};

2 - Создайте фабричный метод в вашем абстрактном MyClassUsingOnSomethingClick:

public static final MyClassUsingOnSomethingClick createEmptyMyClassUsingOnSomethingClick() {
    return new MyClassUsingOnSomethingClick() {
        @Override
        @FromXML
        public void onSomethingClick(View v) {}
    };
}

// and then, create with: :
MyClassUsingOnSomethingClick a = MyClassUsingOnSomethingClick.createEmptyMyClassUsingOnSomethingClick();

Даже если я понимаю, что вы предпочли бы более быстрое решение, я считаю, что это решение является самым чистым, потому что:

  1. Он уважает философию объектно-ориентированного программирования.
  2. Это не относится к IDE.
  3. Он избегает инструмента обработки аннотаций (который, на мой взгляд, следует использовать очень разумно)
person ncenerar    schedule 30.11.2012
comment
Это не неиспользованный метод, а переменная v. - person atamanroman; 30.11.2012
comment
Кстати, если этому методу всегда следует назначать эту аннотацию, я думаю, вы даже можете написать аннотацию прямо в интерфейсе. - person ncenerar; 30.11.2012
comment
Да, но поскольку для переопределенного метода нет предупреждения о неиспользовании параметра, это поможет. - person ncenerar; 30.11.2012
comment
Хорошо, я вижу. Тогда зависит от настройки Ignore in overriding and implementing methods. - person atamanroman; 30.11.2012
comment
@NicolasCenerario Это не общий интерфейс, потому что имя метода различается каждый раз в зависимости от использования в разных классах - person Blundell; 30.11.2012
comment
Да, и вам нужно создать интерфейс для каждого on....Click метода, который вы используете. - person ncenerar; 30.11.2012
comment
@NicolasCenerario по-прежнему имеет ту же проблему, что я хочу использовать атрибут @FromXML вместо @SuppressWarnings / (@Override - обходной путь) не рядом ни с одним из них. - person Blundell; 30.11.2012
comment
@NicolasCenerario ЕСЛИ я создаю встроенный объект, мне больше не нужно объявлять мой onClick в XML, и я могу просто использовать view.setOnClickListener спасибо. Думаю, я сам отвечу на этот вопрос и объясню, что можно, а что нельзя делать с аннотациями. - person Blundell; 05.12.2012

Хорошо, я не могу сделать это каким-либо простым способом или формой.

Глядя на пакет аннотаций http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/package-summary.html

Я не могу расширить аннотацию: Почему невозможно расширить аннотации на Java?

Я не могу реализовать другую аннотацию java.lang .Override

Я не могу имитировать / издеваться / притворяться @Override

Если я добавлю @Override к моему @FromXML, он НЕ наследуется по цепочке.

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

Я также пошел по пути создания интерфейса для моих @FromXML точек входа, это было очень приятно и сообщалось, что мой Activity был типом, и поэтому мне больше не нужна была аннотация, возможно, это изменение дизайна является ответом.

person Blundell    schedule 05.12.2012