Что вы можете сделать в методе ant Task.init ()? - PullRequest
5 голосов
/ 17 февраля 2010

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

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

(И есть ли какой-то другой метод, на который я могу положиться при вызове перед execute (), но после того, как мои данные будут доступны?)

Ответы [ 4 ]

3 голосов
/ 25 февраля 2010

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

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

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

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

2 голосов
/ 24 февраля 2010

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

0 голосов
/ 25 февраля 2010

Чтобы получить эффект от некоторой инициализации в базовом классе до вызова метода 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) вместо перегрузки в зависимости от параметров.

0 голосов
/ 25 февраля 2010

Почему бы не выполнить инициализацию в синглтоне, а затем заставить задачи ant вызывать синглтон для получения инициализированных данных? Тогда вы платите только за инициализацию один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...