我正在开发一些所有需要初始化相同对象的自定义ant任务。我想在init()方法中从Task扩展的公共超类中初始化这些对象。但我从the lifecycle of an ant task看到init()在设置任务子元素和属性之前被调用。因此,如果我正确阅读,那么初始化这些对象所需的所有数据在init()期间都是不可用的。
那么,为什么在此时调用init()?你甚至知道你可以在init()中使用什么?它可以用于什么?
(还有一些其他方法可以依赖于在execute()之前调用,但在我的数据可用之后?)
答案 0 :(得分:3)
最好的指南是查看Ant附带的任务的源代码。 init()
似乎有3个主要用例:
Sync
任务将其大部分工作委托给底层对象,并将一些setXYZ()
传递给此委托。此委托的实例化和预配置必须在任务上设置任何属性之前发生。SSH
任务通过查看System属性来初始化其knownHosts
默认值。此外,调用Project
已将init()
对象注入任务,因此任务可以查看该对象。上述所有内容都可以在任务构造函数中完成,但使用显式init()
方法与Ant任务设计保持一致。
至于问题的第二部分,不,没有生命周期钩子在被设置的属性之间调用,并且execute()
被调用。你必须在execute()
内部做到这一点。
答案 1 :(得分:2)
在解析构建文件时以及在将Task绑定到其拥有项目之后,在每个Task上调用init()方法。因此,任务可以执行涉及Project
实例的工作。
答案 2 :(得分:0)
为什么不在单例中执行初始化然后获取ant任务来调用单例来获取初始化数据?然后你只需支付一次初始化费用。
答案 3 :(得分: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
),而不是根据参数进行重载。