2010-02-17 4 views
5

Я разрабатываю несколько пользовательских задач ant, которые все должны инициализировать одни и те же объекты. Я хотел инициализировать этот объект в общем суперклассе, который простирается от Task, в методе init(). Но я вижу от the lifecycle of an ant task, что init() вызывается до того, как будут установлены дочерние элементы и атрибуты задач. Поэтому все данные, которые мне нужны для инициализации этих объектов, недоступны во время init(), если я правильно читаю.Что вы можете сделать в методе ant Task.init()?

Итак, почему в этой точке называется init()? Что вы даже знаете, что можете использовать в init()? Для чего это можно использовать?

(А есть другой метод, который я могу рассчитывать на вызываться до выполнения(), но после того, как мои данные доступны?)

ответ

3

Лучшее руководство для этого - посмотреть исходный код задач, с которыми поставляется Ant. Существует, по-видимому, 3 основных варианта использования для init():

  1. Предварительная инициализация объектов-делегатов. Например, задача Sync делегирует большую часть своей работы базовому объекту, проходя через часть этого сообщения setXYZ(). Компонент и предварительная настройка этого делегата должны произойти до того, как в задаче будут заданы какие-либо свойства.
  2. Конфигурация значений по умолчанию для значений свойств, которые основаны на общих настройках проекта. Например, задача SSH инициализирует свой knownHosts по умолчанию, просматривая свойство System. Кроме того, объект Project был введен в задачу с помощью init(), поэтому задача может посмотреть на это.
  3. Добавление дополнительных сторонних зависимостей к пути к классам. Например, задача JUnit добавляет различные зависимые от Junit зависимости. Они могут загружаться только при использовании задачи, поскольку они являются необязательными.

Все вышеперечисленное можно было бы сделать внутри конструктора задач, но использование явного метода init() соответствует дизайну задачи Ant.

Что касается второй части вашего вопроса, нет, нет крючка жизненного цикла, который вызывается между устанавливаемыми свойствами и вызывается execute(). Вы должны сделать это внутри execute().

2

Метод инициализации() вызывается на каждой задаче при разборе из build file, а также после того, как Task был связан с его собственным проектом. Таким образом, задача может выполнять работу, которая включает в себя экземпляр Project.

0

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

0

Чтобы получить эффект от инициализации в базовом классе до вызова метода execute, вы можете реализовать execute() в базовом классе, создать эти объекты и вызвать абстрактный метод, объявленный в вашем базовом классе. Например:

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

Вы можете также сохранить созданные объекты как поля и дать метод другое имя (например, executeTask) вместо перегрузки на основе параметров.

Смежные вопросы