2012-08-17 22 views
18

Tengo que crear varios proxies, para agregar, por ejemplo, el registro. Algo así:¿Hay alguna manera de autogenerar envolturas en Eclipse?

interface IMath { 
    public int add(a, b); 
} 

class Math implements IMath { 
    public int add(a, b) { return a + b; } 
} 

class MathWithLogs implements IMath { 
    private IMath realMath; 
    public int add(a, b) { 
     Log.d("tag", "valueable info"); 
     return realMath.add(a, b); 
    } 
} 

Todo está bien siempre y cuando estas interfaces no son 20 los métodos y tengo que añadir algo a una sola.

Mi pregunta es, ¿hay alguna manera de autogenerar las clases contenedoras con algún complemento para eclipse?

O tal vez hay una forma de hacer algo con las anotaciones para invocar métodos de realMath a menos que se indique lo contrario (como @Override)?

+1

Es posible que también desee ver AspectJ (o, en general, AOP), y también los mecanismos de Proxy estándar de Java. Estos manejarán con gracia su caso de uso anterior sin requerir que se escriba ninguna clase nueva. – Romain

Respuesta

26

Haga clic derecho en cualquier archivo fuente (.java) y vaya a source -> Override/Implement Methods/Generate Delegate Methods.

La primera se pegue al cuerpo de todos los métodos de la interfaz inmediata. el segundo hará lo mismo para toda la jerarquía hasta Objeto (supongo, no estoy seguro). Espero que esto ayude.

+0

Cualquiera de ellos admite toda la jerarquía hasta Object. Solo el delegado admite delegados, que generalmente son los que desea en una clase contenedora. Y para eso, no puede hacer clic derecho en ningún lugar de un archivo fuente, debe hacer clic derecho en el campo que desea delegar. – Kidburla

9

Sí, hay un generador de fuente llamado "Generar métodos delegados" que hará exactamente lo que usted desee.

5

Me tomó un tiempo después de leer las otras respuestas para averiguar exactamente qué hacer. La solución es:

  1. Cree su clase contenedora (inicialmente vacía) que implemente la interfaz requerida. Asegúrese de desmarcar "Métodos abstractos heredados" al crear la clase.
  2. Dentro de su nueva clase contenedora (que mostrará un error en este momento debido a que carece de las implementaciones de interfaz), cree un campo que tenga un tipo igual a la interfaz requerida.
  3. Haga clic con el botón derecho en el campo que acaba de crear y seleccione Origen -> Generar métodos delegados.
  4. Marque los métodos que desea crear y haga clic en Aceptar.
  5. Finalmente, agregue un constructor de una sola arg o un método setter para el campo (no se genera automáticamente como parte de este proceso).
Cuestiones relacionadas