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.
Best PracticeKonstruktor mit bestehender Intanz der gleichen Klasse aufrufen
Ich habe das Problem, dass ich einen Kontruktor gerne eine bestehende Instanz der Klasse übergeben möchte (um das Casting von einer Subklasse zu einer Subsubklasse einfacher zu machen).
So sieht das aus:
Java:
public class A{
// Parameter von A
public A(A oldA){
this.parameter1=oldA.parameter1;
//usw
}
// andere Konstruktoren und Funktionen von A
}
public class B extends A{
public B(A oldA){
super(oldA);
}
public C convertToC(Type2 cSpeficParameter){
return new C(this, cSpeficParameter);
}
//Rest von B
}
public class C extends B{
private Type cSpeficParameter;
public C(A oldA, Type cSpeficParameter){
super(oldA);
this.cSpeficParameter=cSpeficParameter;
}
//Rest von C
}
Nun meine Frage A hat sehr viele Parameter, gibt es eine bessere Methode alle Werte in die neue Instanz zu kopieren als mehrere Zeilen this.parameter1=oldA.parameter1? Gibt es einen besseren Weg B zu konvertieren? Hinweis: B ist nicht überflüssig.
Es gibt andere Möglichkeiten, ob diese unbedingt besser sind, musst Du entscheiden: Cloneable, Reflection, Serialisierung/Deserialisierung.
Die Methode convertToC kannst Du einfach löschen. Erstens hast Du dadurch eine zyklische Abhängigkeit, zweitens "kann" die Superklasse nicht wissen, welche Subklassen existieren. Drittens macht es keinen Unterschied, ob ich C myC = myB.convertToC(param); oder gleich C myC = new C(myB, param); schreibe: in beiden Fällen musst Du die B-Instanz und die C-Parameter kennen und wissen, dass Du eine C-Instanz haben willst.
Wie täte das mit Cloneable ausschauen? Reflection könnte eine ziemlich komplexe for-Schleife in der Form
Java:
public A(A oldA){
Method sm;
Method gm;
Class classThis=this.getClass();
for(String p:getClassParameter()){
sm=class.getMethod("set"+p, getType(P));
gm=class.getMethod("get"+p, null);
sm.invoake(this, gm.invoke(oldA));
}
}
Oder so ähnlich werden oder wie? Vor allem wie Mache ich getType p wenn es primitiv sein kann? Serialisierung/Deserialisierung dafür braucht man doch Speicherzugriff oder?