Java: Erstellen eines Unterklassenobjekts aus einem übergeordneten Objekt
Neuling Java-Frage. Sage ich:
public class Car{
...
}
public class Truck extends Car{
...
}
Nehme an, dass ich schon ein Auto-Objekt, wie erstelle ich eine neue LKW-Objekt aus dieser Auto-Objekt, so dass alle die Werte der Auto-Objekt wird kopiert und in meinem neuen Truck-Objekt?
Idealerweise könnte ich tun so etwas wie dieses:
Car c = new Car();
/* ... c gets populated */
Truck t = new Truck(c);
/* would like t to have all of c's values */
Hätte ich das schreiben meiner eigenen copy-Konstruktor? Dies müsste aktualisiert werden, everytime, das Auto bekommt ein neues Feld...
InformationsquelleAutor der Frage | 2009-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, fügen Sie einfach einen Konstruktor LKW. Sie werden wahrscheinlich wollen, fügen Sie einen Konstruktor Auto auch, wenn auch nicht unbedingt öffentlich:
Regel ist es im Allgemeinen am besten, um Klassen, die entweder Blatt, und möchten Sie vielleicht, um diejenigen markieren, die Letzte) oder Abstrakt.
Sieht es aus, als wenn Sie möchten, eine
Car
Objekt, und dann die gleiche Instanz wiederum in einemTruck
. Ein besserer Weg, dies zu tun ist, zu delegieren, Verhalten auf ein anderes Objekt innerhalbCar
(Vehicle
). Also:Wenn Sie implementieren
Cloneable
dann kann man "automatisch" kopieren eines Objekts, um eine Instanz derselben Klasse. Es gibt jedoch eine Reihe von Problemen, einschließlich müssen auf jeder Kopie Gebiet der veränderlichen Gegenstände, die anfällig für Fehler und verbietet die Verwendung von Finale.InformationsquelleAutor der Antwort Tom Hawtin - tackline
Wenn Sie den Frühling in Ihr Projekt, das Sie verwenden ReflectionUtils.
InformationsquelleAutor der Antwort Pawel.Duleba
Ja, müssen Sie dies manuell tun. Sie müssen auch entscheiden, wie "tief" zu kopieren Dinge. Zum Beispiel, angenommen, das Auto hat eine Sammlung von Reifen - könnten Sie tun, ein flachen Kopie der Sammlung (so dass, wenn das original-Objekt ändert sich der Inhalt der Sammlung, das neue Objekt würde die auch ändern), oder Sie könnten einen tief - Kopie, die erstellt eine neue Sammlung.
(Dies ist, wo unveränderliche Typen wie
String
oft in handliches kommen - es gibt keine Notwendigkeit, Sie zu duplizieren; Sie können einfach kopieren Sie die Referenz und die wissen, dass der Inhalt des Objekts nicht ändern.)InformationsquelleAutor der Antwort Jon Skeet
Gar nicht!
Diesem Weg versuchen:
InformationsquelleAutor der Antwort Christian
Grundsätzlich ja - man kann nicht nur konvertieren Sie ein Objekt in Java.
Glücklicherweise sind Sie nicht schreiben den code selbst - schauen Sie in commons-beanutilsinsbesondere Methoden wie cloneBean. Dies hat den zusätzlichen Vorteil, dass Sie nicht haben, um es zu aktualisieren, jedes mal, es wird ein neues Feld!
InformationsquelleAutor der Antwort
können Sie mithilfe von reflektion, die ich tun und es funktioniert gut für mich:
InformationsquelleAutor der Antwort rcorbellini
Können Sie mit der reflection-API, um eine Schleife durch jedes der Auto Felder und weisen Sie den Wert der äquivalenten LKW-Bereich. Diese kann getan werden, innerhalb der LKW. Weiter ist es der einzige Weg, um Zugang zu den privaten Bereichen Car - zumindest in einem automatischen Sinn, sofern ein security-manager ist nicht vorhanden und die Beschränkung des Zugangs zum privaten Bereich.
InformationsquelleAutor der Antwort Martin OConnor
Benötigen Sie einen copy-Konstruktor, sondern Ihre copy-Konstruktor mithilfe von reflektion finden Sie die Allgemeinen Felder zwischen die beiden Objekte, erhalten Ihre Werte aus der "Prototyp" - Objekt, und legen Sie Sie auf das untergeordnete Objekt.
InformationsquelleAutor der Antwort tvanfosson
Konnte man immer verwenden ein mapping-Framework wie Dozer. Standardmäßig (ohne die weitere Konfiguration), er ordnet alle Felder mit dem gleichen Namen, von einem Objekt zum anderen über die getter-und setter-Methoden.
Abhängigkeit:
Code:
InformationsquelleAutor der Antwort schnatterer
Den Lösungen oben dargestellten Einschränkungen, die Sie beachten sollten. Hier eine kurze Zusammenfassung der algorithmen für das kopieren von Feldern von einer Klasse zur anderen.
Ich reproduzieren Sean Patrick Floyd ' s
analyze
Funktion, die mit der fehlenden Anweisung:InformationsquelleAutor der Antwort Moshe Rubin