Lassen Sie uns sagen, dass wir die Person Einheit haben:Wie schreibt man die wartbare merge() Methode?
class Person {
/*
once the id is assigned, then must not be modified!
assume that the id will be assigned by the ORM framework
*/
int id;
String givenName;
String familyName;
}
Und ich, wir haben zwei Personen: original Person und aktualisiert Person:
Person original = new Person("Frantisek", "Makovicka");
Person updated = new Person("Viktor", "Makovicka");
Ich möchte mit Original-Person Person fusionieren aktualisiert, so schrieb ich die folgende einfache Methode:
// return number of changed fields
public int merge(Person original, Person updated) {
int changes = 0;
String oldGivenName = original.givenName;
original.givenName = updated.givenName;
if (changed(oldGivenName, original.givenName)) changes++;
String oldFamilyName = original.familyName;
original.familyName = updated.familyName;
if (changed(oldFamilyName, original.familyName)) changes++;
return changes;
}
Es funktioniert gut, aber ich sehe einige Probleme:
jedes Mal, Es wird ein neues Feld zur Person-Klasse hinzugefügt, der Programmierer sollte nicht vergessen, die merge() -Methode zu aktualisieren und falls die Person wirklich viele Felder hat, wird es schwierig sein, diese Methode beizubehalten.
Also meine Frage ist: Gibt es eine kluge/robuste Möglichkeit, den Zustand der Objekte ohne Verwendung der Reflexionsfunktion der Sprache zu verschmelzen, so dass Sie sicher sein können, dass alle und nur benötigte Felder zusammengeführt werden? Vielen Dank im Voraus!
UPD:
Ursprünglich fragte ich, ob es die Art und Weise des Schreibens ohne Reflexion der Verwendung aber vergessen zu sagen, dass es nicht die Einschränkung ist! Ich sollte auch sagen, dass ich eine Idee hatte, diese Methode mit Reflection + Annotations "Merge-fähigen" Felder mit einigen benutzerdefinierten Annotation zu schreiben und dann einfach Felder ohne Annotation überspringen. die Absicht dieser Worte also: „unreflektiert mit“ ist, andere vielleicht entdecken nicht so offensichtlich Lösungen :)
Inspiration für diese Frage wurde diese funktionale Stil-Methode: (welche die Ressource geschlossen wird gewährleistet, nehmen Sie es nur als Beispiel für nicht so offensichtliche Lösung und sichere Programmierung)
public static void doWithResource(String name, Consumer<Resource> consumer) {
Resource res = new Resource(name);
consumer.accept(res);
res.close();
}
geändert ist nicht definiert. Sie müssen Änderungen bedeuten ++. Wie es jetzt eingerichtet wird, erhalten Sie immer 0 von der obigen Methode zurück. – Inxsible
Sie überschreiben das Original mit dem aktualisierten, in diesem Fall sollten Sie wahrscheinlich nur den Originalzeiger überschreiben und keine Merge-Methode aufrufen. Wenn Sie dies tun müssen, denke ich, dass Sie nach Reflexion suchen. (Der Hauptunterschied ist, wenn es sich um zwei verschiedene Klassen handelt, die die Person erweitern, sollte die Verschmelzung sinnvoll sein?) – Tezra
Sie könnten etwas nachdenken und jedes (vielleicht annotierte) Feld Ihrer Klasse betrachten. – danielspaniol