Angenommen, ich habe eine abstrakte Basisklasse, die die Runnable-Schnittstelle implementiert.Ist es OK, abstrakte Methode vom Konstruktor in Java aufzurufen?
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();
}
Und hier ist eine der wenigen abgeleiteten Klassen.
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);
}
}
Der Punkt ist, dass ich einige allgemeine Sachen meine Basisklasse machen wollen, anstatt sie jedes Mal zu kopieren. Eigentlich ist es läuft gut, der Ausgang ist immer das gleiche:
Basiskonstruktor Derivative Thread mit param 1 erstellt Derivat mit param 1
laufen Aber ist es in Java sicher ein Thread der Aufruf zu starten abstrakte Methode im Konstruktor? Weil es in C++ und C# in den meisten Fällen unsicher ist, soweit ich weiß. Vielen Dank!
Wäre es etwas Unpassendes, wenn ein Konstruktor eine abstrakte oder virtuelle Methode * aufruft, deren Vertrag angibt, dass er von einem Konstruktor aufgerufen werden kann, muss er aus einem solchen Kontext sicher aufrufen und nur andere ähnliche Methoden aufrufen sicher*? – supercat
@supercat: Ich nehme an, das hängt davon ab, wie sehr Sie der Dokumentation vertrauen, wie sehr Sie anderen vertrauen, solchen Dokumentationen zu folgen, und wie sehr Sie jedem trauen, der jemals eine solche Klasse oder irgendeine Unterklasse erweitern könnte, um sich entsprechend weiterzuentwickeln oder daran zu erinnern beziehen Sie sich auf solche Warnungen. Das ist meiner Meinung nach sehr viel Vertrauen. Ich bevorzuge Dinge, die durch automatisierte Tests bewiesen werden können, und das kann nicht. –
Fair genug. Der größte Anwendungsfall, den ich im Sinn hatte, war eine Situation, in der eine abgeleitete Klasse eine Methode überschreiben sollte, um eine Konstante zurückzugeben, die für alle Instanzen jeder Unterklasse gleich sein muss und die im Konstruktor und anderswo benötigt wird. Eine typische Implementierung wäre also 'int getWoozleForType() {return 23;} '. Eine solche Sache an den Konstruktor zu übergeben und sie in einem Instanzfeld speichern zu lassen, scheint ein bisschen eklig zu sein, und mir sind auch keine anderen Ansätze bekannt, die einladend erscheinen. – supercat