Crear una anotación Java con comportamiento contextual IDE

He creado una anotación

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

Estoy utilizando esto en los métodos que se parecen a esto:

 @FromXML public void onSomethingClick(View v){ } 

La variable v es necesaria para que el sistema de reflexión de Android llame a este método. Sin embargo, la entrada var v no se utiliza, por lo que mi IDE me advierte de esto. Me gusta esta advertencia y la quiero para el resto de mi código .

Introduzca aquí la descripción de la imagen

Para ocultar la advertencia que podría hacer

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

O podría agregar una etiqueta de param

Pero prefiero que el IDE (eclipse) lea mi anotación @FromXML y no me da la advertencia.

Sé que no se puede extender una Anotación , pero eso es básicamente lo que quiero hacer.

¿Hay una manera que puedo agregar mi anotación para ser reconocida como una anotación de ' suprimir advertencias '.

o

¿Hay una forma de codificar mi anotación para 'actuar como' suprimir las advertencias?

Siempre puede crear un complemento para Eclipse , que escaneará el origen y encontrará estas anotaciones en su caso @FromXML y agregará una anotación adicional en su caso @SuppressWarnings .

Usted podría crear un comando para él y cuando ese comando se disparó que ejecutaría este complemento.

Creación del complemento de Eclipse

Espero que esto ayude.

ACTUALIZACIÓN – ERA UNA FLUKE NO SE PUEDE HACER USANDO ESTO (INTENTADO):

O Uso de AspectJ para eliminar las advertencias Adición de advertencias en Eclipse con AspectJ

Este tutorial utiliza AspectJ para agregar advertencias a eclipse si el desarrollador utiliza System.out.println() en el código. Así que se puede hacer lo contrario para eliminar la advertencia cuando está presente la anotación.

UPDATE 2: Existe una manera en Eclipse de crear un procesador de anotación personalizado o de editar el procesador de anotación bundeled (que genera la advertencia de variable no utilizada). Así que tendrá que ajustar ese procesador de una manera personalizada.

Algunos enlaces excelentes:

Tutoriales para el desarrollo del procesador de anotaciones en Eclipse

Herramientas de desarrollo de Java – Herramientas de procesamiento de anotaciones

Creo que podría crear una interfaz que define este método. De esta manera, su clase anulará el método y no debería haber ninguna advertencia.

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){ } } 

EDIT: Otra solución podría ser definir su método como abstracto. De hecho, según entiendo su código, sus métodos son sólo declaración (las implementaciones están en un archivo XML). Por lo tanto, su problema es más un problema de diseño que un problema de IDE (su IDE es justo sobre la advertencia). La realidad es que su método es abstracto y se define en otro lugar.

Por lo tanto, la definición de su método como resumen resolverá el problema, pero tendrá que hacer la clase abstracta:

 public abstract class MyClassUsingOnSomethingClick { /* * All the class implementation can be here as the normal class. */ @FromXML public abstract void onSomethingClick(View v); } 

Sé que usted dirá que esta solución hace que sea imposible crear objetos fácilmente, pero tendrá dos soluciones a continuación:

1 – Crea tus objetos en línea:

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

2 – Crear un método de fábrica en su resumen MyClassUsingOnSomethingClick :

 public static final MyClassUsingOnSomethingClick createEmptyMyClassUsingOnSomethingClick() { return new MyClassUsingOnSomethingClick() { @Override @FromXML public void onSomethingClick(View v) {} }; } // and then, create with: : MyClassUsingOnSomethingClick a = MyClassUsingOnSomethingClick.createEmptyMyClassUsingOnSomethingClick(); 

Incluso entiendo que preferirías una solución más rápida, creo que esta solución es la más limpia porque:

  1. Respeta la filosofía de programación orientada a objetos.
  2. No es específico de un IDE.
  3. Evita la herramienta de procesamiento de anotaciones (que, en mi opinión, debe utilizarse con mucha prudencia)

Ok, no puedo hacer esto de ninguna manera fácil.

Mirando el paquete de anotaciones http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/package-summary.html

No puedo extender una anotación: ¿Por qué no es posible extender anotaciones en Java?

No puedo implementar otra anotación java.lang.Override

No puedo imitar / fingir / pretender ser @Override

Si agrego @Override a mi @FromXML no se hereda en la cadena.

La única manera sería crear un complemento de Eclipse que reconozca mi anotación y detenga la advertencia. Es una pena porque no puedo encontrar una manera fácil de hacer esto.

También fui por la ruta de la creación de una interfaz para mi @FromXML puntos de entrada, esto fue muy agradable y se comunicó mi Activity era de un tipo y por lo tanto, no necesitaba la anotación más, tal vez este cambio de diseño es la respuesta.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.