假設我有一個實現了Runnable接口的抽象Base類。可以從Java的構造函數中調用抽象方法嗎?
public abstract class Base implements Runnable {
protected int param;
public Base(final int param) {
System.out.println("Base constructor");
this.param = param;
// I'm using this param here
new Thread(this).start();
System.out.println("Derivative thread created with param " + param);
}
@Override
abstract public void run();
}
這裏是少數派生類之一。
public class Derivative extends Base {
public Derivative(final int param) {
super(param);
}
@Override
public void run() {
System.out.println("Derivative is running with param " + param);
}
public static void main(String[] args) {
Derivative thread = new Derivative(1);
}
}
重點是我希望我的基類做一些普通的東西,而不是每次都複製它。 其實,這是運行良好,輸出始終是相同的:
基本構造 與參數1 衍生物,其與參數1
運行,但它是安全用Java創建衍生線程啓動一個線程調用抽象方法在構造函數中?因爲在C++和C#中,在大多數情況下它是不安全的,據我所知。 謝謝!
如果有構造函數調用抽象或虛方法*,它的約定指定它可以從構造函數中調用,從這樣的上下文調用時必須是安全的,並且只能調用其他類似的方法安全*? – supercat 2013-11-13 22:39:42
@supercat:我想這取決於你對文檔的信任程度,你相信其他人遵守這些文檔的程度,以及你相信每個可能擴展這樣一個類或其任何子類以適當地傳播或記住請參閱此類警告。在我看來,這是相當多的信任。我更喜歡可以通過自動化測試證明的事情,而不是。 – 2013-11-13 23:08:18
夠公平的。我想到的最大的用例是一個派生類可能會覆蓋一個方法來返回一個常量,這個常量對於每個子類的所有實例必須是相同的,並且在構造函數和其他地方需要這個常量,所以一個典型的實現是'int getWoozleForType(){return 23;}'。將這樣的東西傳遞給構造函數,並將其存儲在實例字段中似乎有點兒瑣碎,我想不出任何其他方法。 – supercat 2013-11-13 23:20:33