2010-02-17 63 views
5

我正在開發一些所有需要初始化相同對象的自定義ant任務。我想在init()方法中將這些對象初始化爲從Task中擴展的公共超類。但是我從the lifecycle of an ant task看到init()在設置任務子元素和屬性之前被調用。因此,在init()期間,如果我閱讀正確,我需要的用於初始化這些對象的所有數據都不可用。你可以在ant Task.init()方法中做什麼?

那麼,爲什麼在此時調用init()呢?你甚至知道你可以在init()中使用什麼?它可以用來做什麼?

(而且是沒有辦法,我可以依靠之前調用執行()等方法,但經過我的數據是否可用?)

回答

3

對此的最佳指導是查看Ant附帶的任務的源代碼。 init()似乎有3個主要用例:

  1. 委託對象的預初始化。例如,Sync任務將其大部分工作委託給一個底層對象,並通過一些setXYZ()傳遞給該委託。此任務的實例化和預配置必須在任務上設置任何屬性之前進行。
  2. 屬性值的默認配置,基於常規項目設置。例如,SSH任務通過查看System屬性來初始化其knownHosts默認值。另外,Project對象已被注入任務,由init()被調用,所以任務可以看一下。
  3. 將可選的第三方依賴關係添加到類路徑中。例如,JUnit任務添加了各種與Junit相關的依賴項。這些只能在使用任務時加載,因爲它們是可選的。

以上所有內容都可以在任務構造函數內完成,但使用明確的init()方法與Ant任務設計保持一致。

至於你的問題的第二部分,不,沒有生命週期鉤子被調用的屬性被設置,並調用​​。你必須在​​之內這樣做。

2

在init()方法時的解析呼籲每個任務構建文件,並在任務被綁定到其擁有的項目之後。因此該任務可以完成涉及Project實例的工作。

0

爲什麼不在單例中執行初始化,然後讓ant任務調用singleton來獲取初始化數據?然後你只支付一次初始化費用。

0

爲了在調用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),而不是超載基礎上的參數。

相關問題