眼下調用覆蓋的方法在一些Java代碼我有這樣的事情Java中,隱含
class A {
void f() {
}
A() {
f();
}
}
class B extends A{
@Override
void f() {
//do some stuff
super.f();
}
}
class C extends B {
@Override
void f() {
//do some stuff
super.f();
}
}
我想有f()
打了個電話,然後通過每個父類迭代向上,運行覆蓋f()
。我通過明確地呼叫super.f()
這樣做,但我不想這樣做。
我這樣做的原因是後處理必須在達到A中的構造函數後完成。每個班級都有很多狀態正確的啓動,這就是爲什麼我們有上升趨勢f()
的原因。
所以A
構造是真的
A() {
//init some state in a
f(); //run f(), which will depend on the previous operation
}
如果我這樣做new C();
我想C.f()
叫,然後B.f()
調用,那麼A.f()
稱爲
無論如何,如果有這樣的一個更聰明的方式這,我對它開放。
對於「在構造函數中調用非最終方法通常是一個糟糕的主意」(從經驗:-) – 2009-10-02 21:23:30
我不需要任何構造函數已經運行,只要A的第一部分()被執行,我們狀態良好。這是通過使用私有名稱空間而不使用序列化接口來進行序列化的黑客攻擊的一部分。基本上所有類都事先聲明它們將要使用的變量,但是init是私有名稱空間。感謝Jon的回覆,我想這是不可能的,很高興有第二個意見 – Mike 2009-10-02 21:27:02
但是,在構造函數中使用模板方法模式有時很有吸引力。只要抽象(或非最終)方法實現算法而不依賴於狀態,它就可以工作。另一個解決方案是使用延遲初始化。我有一個關於這個問題的博客:http://novyden.blogspot.com/2011/08/java-anti-pattern-constructors-and.html – topchef 2011-08-14 06:26:26