2010-02-17 13 views
5

Estoy desarrollando algunas tareas personalizadas que todas necesitan inicializar los mismos objetos. Quería inicializar esos objetos en una superclase común que se extiende desde Tarea, en el método init(). Pero veo desde the lifecycle of an ant task que se llama a init() antes de que se establezcan las tareas de elementos secundarios y atributos. Entonces, todos los datos que necesito para inicializar esos objetos no están disponibles durante init(), si estoy leyendo bien.¿Qué se puede hacer en el método ant Task.init()?

Así que, ¿por qué es init() llama a este punto? ¿Qué sabes que podrías usar en init()? ¿Para qué podría ser utilizado?

(¿Y hay algún otro método que pueda confiar para ser llamada antes de ejecutar(), pero después de mis datos están disponibles?)

Respuesta

3

La mejor guía para esto es mirar el código fuente de las tareas que se incluye con la hormiga. Parece que hay 3 casos de uso principal para init():

  1. Preinicialización de objetos delegados. Por ejemplo, la tarea Sync delega la mayor parte de su trabajo a un objeto subyacente, pasando a través de algunos de los setXYZ() a este delegado. La instanciación y preconfiguración de este delegado tiene que suceder antes de que se establezcan las propiedades en la tarea.
  2. Configuración de los valores predeterminados para los valores de propiedad, que se basan en la configuración general del proyecto. Por ejemplo, la tarea SSH inicializa su valor predeterminado knownHosts mirando una propiedad del sistema. Además, el objeto Project ha sido inyectado en la tarea por el init() se llama, por lo que la tarea puede mirar eso.
  3. Adición de dependencias opcionales tercera parte en la ruta de clase. Por ejemplo, la tarea JUnit agrega varias dependencias relacionadas con Junit. Estos solo se pueden cargar cuando se usa la tarea, ya que son opcionales.

Todo lo anterior es concebible podría hacerse dentro del constructor de tareas, pero el uso de un método explícito init() está en consonancia con el diseño de las tareas Ant.

En cuanto a la segunda parte de su pregunta, no, no hay ningún gancho del ciclo de vida que se llama entre las propiedades que se están configurando, y se llama al execute(). Tienes que hacer eso dentro del propio execute().

2

El método init() se llama en cada tarea en el análisis de la archivo de compilación y también después de que la tarea se vinculó a su proyecto propietario. Entonces, la Tarea puede hacer un trabajo que involucre una instancia de Project.

0

Por qué no realiza la inicialización en un conjunto unitario y luego obtener las tareas de hormigas para llamar al singleton para obtener los datos initialsed? Entonces solo pagas por la inicialización una vez.

0

Para obtener el efecto de hacer un poco de inicialización en los baseclass antes de que el método de ejecución se llama puede implementar execute() en la clase base, crear estos objetos, y llame a un método abstracto declarado en su clase base. Por ejemplo:

public abstract class BaseClass extends Task { 
    public final void execute() { 
    Foo foo = createFoo(); 
    Bar bar = createBar(foo); 
    execute(foo,bar); 
    } 
    public abstract void execute(Foo foo, Bar bar); 
} 

public class BazTask extends BaseClass { 
    public void execute(Foo foo, Bar bar) { 
    System.out.println("foo is " + foo + " and bar is " + bar); 
    } 
} 

También puede almacenar los objetos creados como los campos y dar al método un nombre diferente (como executeTask) en lugar de sobrecargar la base de los parámetros.

Cuestiones relacionadas