Hallo!
Ist wohl eine Anfängerfrage
Ich habe ein Problem mit dem Abbrechen von Änderungen an einem Objekt (Member), welches an einen Editor übergeben wurde.
Zum Veranschaulichen der Code:
Eine Klasse zum Erzeugen meines Mitglieds (Member) und die Klasse "Editor".
Zudem eine Testklasse mit "main", welche ein Member erzeugt und den Vornamen auf "Hans" setzt.
Anschließend wird das Member-Objekt an den Editor übergeben. Dieser legt im Konstruktor eine Kopie des Grundzustands an, um diese Kopie im später aufgerufenen "cancelEditing" wieder herzustellen.
Dies klappt aber nur in der Klasse "Editor". In der aufrufenden Klasse bleibt der geänderte Vorname leider bestehen!
Kann mir jemand erklären, was ich falsch mache? Bzw, viel wichtiger, wie ich es machen kann, dass ich im Editor abbrechen kann, ohne von meinem Member manuell eine Kopie anzulegen und damit alle Atrribute (in meinem Bsp. ist es nur ein Attribut, in meinem Anwendungsfall aber unzählige) kopieren zu müssen?
Ich wäre sehr dankbar!
Viele Grüße
JAR
Und nun die Codesnippets:
Ist wohl eine Anfängerfrage
Ich habe ein Problem mit dem Abbrechen von Änderungen an einem Objekt (Member), welches an einen Editor übergeben wurde.
Zum Veranschaulichen der Code:
Eine Klasse zum Erzeugen meines Mitglieds (Member) und die Klasse "Editor".
Zudem eine Testklasse mit "main", welche ein Member erzeugt und den Vornamen auf "Hans" setzt.
Anschließend wird das Member-Objekt an den Editor übergeben. Dieser legt im Konstruktor eine Kopie des Grundzustands an, um diese Kopie im später aufgerufenen "cancelEditing" wieder herzustellen.
Dies klappt aber nur in der Klasse "Editor". In der aufrufenden Klasse bleibt der geänderte Vorname leider bestehen!
Kann mir jemand erklären, was ich falsch mache? Bzw, viel wichtiger, wie ich es machen kann, dass ich im Editor abbrechen kann, ohne von meinem Member manuell eine Kopie anzulegen und damit alle Atrribute (in meinem Bsp. ist es nur ein Attribut, in meinem Anwendungsfall aber unzählige) kopieren zu müssen?
Ich wäre sehr dankbar!
Viele Grüße
JAR
Und nun die Codesnippets:
Java:
package testpackage;
import org.openide.util.Exceptions;
public class Member implements Cloneable {
private String firstname = "";
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@Override
public Member clone() {
Member member = null;
try {
member = (Member) super.clone();
} catch (CloneNotSupportedException ex) {
Exceptions.printStackTrace(ex);
}
return member;
}
}
Java:
package testpackage;
public class Editor {
private Member memberUnedited;
public Member getMemberUnedited() {
return memberUnedited;
}
public void setMemberUnedited(Member memberUnedited) {
this.memberUnedited = memberUnedited;
}
private Member member;
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public Editor(Member member) {
// Sicherungskopie, falls Editor abgebrochen (cancel) wird
setMemberUnedited(member.clone());
// Zu editierendes Mitglied:
setMember(member);
}
public void changeFirstname(String newFirstname) {
getMember().setFirstname(newFirstname);
}
public void cancelEditing() {
System.out.println("Vorname in cancelEditing (vorm Rückgängigmachen): " + getMember().getFirstname());
// Änderungen rückgängig machen
setMember(getMemberUnedited());
System.out.println("Vorname in cancelEditing (nachm Rückgängigmachen): " + getMember().getFirstname());
}
}
Java:
package testpackage;
public class Test {
public static void main(String[] args) {
// Mitgliedsobjekt anlegen und Vornamen auf "Hans" setzen
Member member = new Member();
member.setFirstname("Hans");
// Mitgliedsobjekt an einen Editor übergeben
Editor editor = new Editor(member);
editor.changeFirstname("Wurst");
System.out.println("Vorname in main (vorm Rückgängigmachen): " + member.getFirstname()); // liefert "Wurst"
editor.cancelEditing();
System.out.println("Vorname in main (nachm Rückgängigmachen): " + member.getFirstname()); // liefert leider auch "Wurst" !!!
}
}
Zuletzt bearbeitet von einem Moderator: