Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Folgendes Beispiel funktioniert leider nicht. Die Klasse Master soll über eine statische Methode eine Instance einer Unterklasse erzeugen. Dafür wird ein Parameter vom Type Class übergeben.
Java:
public abstract class Master {
abstract public void speak();
public static Master create(Class<Master> masterClass) {
Master instance = null;
try {
instance = masterClass.newInstance();
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
return instance;
}
}
Java:
public class One extends Master {
@Override
public void speak() {
System.out.println("one");
}
}
Java:
public class ClassTest {
public static void main(String[] args) {
Master one = Master.create(One.class);
one.speak();
}
}
Error Zeile 4: The method create(Class<Master>) in the type Master is not applicable for the arguments (Class<One>)
Weil dem new One() noch ein oneInstance.setOwner(...) folgt. DEn Parameter möchte ich aber nicht im Konstructor haben, deswegen der Umweg über Master.create(owner,konkreteKlasse).
Warum willst du den Parameter denn nicht im Konstruktor haben? Gibts dafür nen guten Grund?
Alternativ zu dem Reflection krams, könntest du auch noch sowas machen:
Java:
public class One extends Master {
public static Master createIntance (Master owner) {
Master one = new One();
one.setOwner(owner);
return one;
}
}
Damit sparst du dir Reflection. Aber wie gesagt, wenn owner ne Abängigkeit von one ist, dann würd ichs ganz normal im Konstruktor übergeben.
Naja, aber dann doch lieber den Konstruktor explizit hinschreiben, als da mit Reflection rumzuhantieren.
Woher soll sonst jemand wissen wenn er ein One Objekt erstellen möchte dass er entweder später noch einen Owner setzt oder die Master.create Methode nutzt?
Durch den Konstruktor führt kein Weg dran vorbei einen owner mitzugeben.
Ja, das kann durchaus sein. Möglicherweise erkaufe ich mir die paar Zeilen weniger Code, mit Problemen die später entstehen, weil andere oder ich selbst nicht mehr verstehen was der Sinn dahinter war. Es kann sein, dass ich in ein paar Tagen auch anderes darüber denke und das ganze wieder rückgäng mache.
Mich stört z.B. auch, dass ich den Konstructor der Unterklassen nicht auf private Sichtbarkeit ändern kann. Dadurch könnte ich sonst den Konstructor verstecken und vermeiden, dass jemand eine Instaz per new erzeugt.
Naja, ich habe mich jetzt doch davon verabschiedet und benutze Konstrutoren. Ich denke die Probleme kommen sonst in der Zukunft, weil es zu kompliziert ist. Lieber ein paar Zeilen mehr Code, dafür einfach.