Ich habe die folgenden zwei Klassen:
%Vor%Ich hätte gerne einen Konstruktor in SuperUser, der ein Objekt vom Typ User annimmt und ein Objekt vom Typ SuperUser erstellt. Zum Beispiel:
%Vor%Wenn dem User-Objekt der Konstruktor User (User existantUser) fehlt, gibt es eine automatische Möglichkeit, das SuperUser-Objekt mit allen Feldern des vorhandenen Benutzerobjekts zu initialisieren? Ich versuche, 50 Zeilen zu vermeiden:
%Vor%Wenn dies nicht möglich ist, gibt es ein Refactoring wie "Create Copy Constructor?"
Danke!
Sehen Sie sich commons-beanutils an BeanUtils.copyProperties(..)
:
Alternativ können Sie dies im Kopierkonstruktor ablegen:
%Vor%Sie können zwar etwas wie BeanUtils verwenden, um das zu tun, was Sie zu tun versuchen, wenn Sie einen Benutzer zu SuperUser hochstufen oder einen SuperUser zu einem Benutzer degradieren wollen, verwenden Sie die richtige Abstraktion.
Können Sie Ihren Code umgestalten, sodass der Benutzer über Berechtigungen oder Berechtigungen verfügt? Im Allgemeinen, wenn ich das Gefühl habe, dass ich ein Objekt in ein anderes Objekt in der Hierarchie ändern muss, ordne ich die Hierarchie neu an.
Zum Beispiel:
%Vor%Wenn Sie diese Änderung nicht machen wollen, dann würde Bozhos Antwort funktionieren.
Reflexion & amp; BeanUtils sind praktisch, aber langsam. Vielleicht ist es in Ihrem Fall eine Abwägung wert, aber ich würde sie vermeiden. Object.clone () wird Ihnen nicht geben, was Sie wollen .. weil die clone () -Methode des Benutzers (falls implementiert ... und es ist wahrscheinlich nicht) .. Ihnen einen Benutzer geben wird .. kein SuperUser.
clone () wird selten verwendet. Copy-Konstruktor oder eine Factory-Methode sind beide sinnvolle Muster.
Bearbeiten: Vergessen, die Frage zu beantworten. Ja, manuell implementieren Sie den Kopierkonstruktor. Java == Viel tippen.
// ...another 50-60 fields.
Anstelle von String firstName
etc sollte der Benutzer Felder wie Name name
haben, die erste, letzte, Titel usw. haben.
Sie könnten dasselbe für Ihre Adressen, Kontaktdetails usw. tun. Dies würde einen Kopierkonstruktor eher vereinfachen.
Übrigens, da SuperUser den Benutzer erweitert, wäre Ihr Konstruktor
%Vor%Wenn Sie BeanUtils auf Android verwenden möchten, aber kein Glück, versuchen Sie stattdessen android-java-air-bridge. Ссылка
Laden Sie einfach die android-java-air-bridge.jar.zip herunter, extrahieren Sie die .jar-Datei und importieren Sie sie in Ihr Projekt. Sie müssen keinen Code ändern.
Beispiel:
%Vor%Tags und Links java