2016-08-13 44 views
2

我有一種情況,在類初始化期間,一個子類(我們稱之爲​​)調用基類的靜態方法(我們稱之爲BaseClass)並傳遞​​作爲參數來標識正在初始化的特定類,或者Java的:在靜態類初始化程序中是否有與Java的「this」等效的內容?

public class SubClass extends BaseClass { 
    static { BaseClass.init(SubClass.class); } 
    ... 
} 

代替BaseClass具有方法:

protected static void init(Class<?> c) { 
    ... 
} 

我願做的是有BaseClass通話init自動,如:

public class BaseClass { 
    static { init(thisclass); } 
    ... 
} 

所以,問題是,它的Java有一些關鍵字,通過上述thisclass表示,返回的類類初始化初始化?

+1

如果您有多個子類,那麼一個基類靜態初始化程序如何初始化多個子類? –

+0

在'BaseClass'的靜態初始化塊中初始化的類總是'BaseClass'。如果你期望初始化器運行子類,你需要調整你的期望值。 – user2357112

+0

也許將此視爲一個抽象問題。我從我的實現中解決了這個問題,這很好,但我想避免必須明確告訴基類正在初始化哪個子類。實際上,我將SubClass.class的值存儲爲Map的鍵;映射的值是BaseClass爲每個子類跟蹤的信息。 –

回答

3

不,沒有。

此外,正如user2357112在註釋中所述,BaseClass的靜態初始化程序只會運行一次,而初始化爲BaseClass。它不像實例構造函數,每次創建子類的實例時都會運行。基本上你應該堅持你現有的計劃。

還值得注意的是,如果您希望子類用某種東西「註冊自己」,您可能會驚訝於子類初始化不會發生

例如,如果你在基類中的靜態方法foo,然後調用Subclass.foo()不會初始化Subclass - 只有基類,因爲子類沒有需要因爲沒有進行初始化,其代碼正在執行。

+0

好的,謝謝!我錯過了關於只運行一次的基類初始化器的部分;我應該已經知道了。雖然目前的實施工作,我不得不重新考慮我想解決的問題,看看是否有更好的方法。 –

+0

感謝您的所有意見!我重寫了實現,以便在基類的第一次實例方法首次注意到子類未註冊時,基類自己代表子類調用它的init方法本身。不幸的是,這會在基類的實例方法中花費運行時檢查,但它使註冊完全自動化。 –

-2

不,沒有,因爲這裏沒有實例。就像靜態方法一樣。

+0

@downvoter好的,這是什麼?這裏有*是一個實例嗎?但仍然沒有「這個」?請說明。 – EJP

相關問題