簡單的規則是不直接或間接地從構造函數中訪問「this」對象。
這意味着您不應該從構造函數調用overrideable方法,也不應該調用調用可覆蓋方法的方法,也不應調用調用可覆蓋方法方法的方法,或者...您明白了。
這也意味着你不應該把「this」傳遞給任何東西,因爲另一件事可能會調用一個可覆蓋的方法。
在你的特殊情況下,你有什麼是好的。如果是更改爲:
class Bar extends Foo
{
public Bar() {
super (doSmth(this));
...
}
private static String doSmth (Bar bar) {
//what I can NOT do here?
}
}
然後,你將有一個(潛在的)問題,因爲doSmth可以在酒吧依賴於在尚未初始化的數據的子類調用覆蓋方法。
下面是可能發生的事情爲例:
public class Main
{
public static void main(final String[] argv)
{
final A a;
a = new B();
a.foo();
}
}
abstract class A
{
protected A()
{
bar(this);
}
private static void bar(final A a)
{
a.foo();
}
public abstract void foo();
}
class B extends A
{
final String str;
public B()
{
super();
str = "Hello, World!";
}
public void foo()
{
System.out.println("str - " + str);
}
}
所以,只要你不叫任何重載方法你都不錯。然而,最簡單的做法是遵循永不傳遞構造函數的「規則」,並且從構造函數直接或間接調用overrideable(非final)方法。
這是使我討厭繼承的問題之一。 – whiskeysierra 2010-07-01 21:22:36