Cloneable Probleme

Otz

Bekanntes Mitglied
hallo

ich versuche gerade ein java objekt zu kopieren. nach einigen vergeblichen versuchen bin ich auf das interface cloneable gestoßen.


hier mein codefragment:


ich habe in dem objekt, welches ich clonen möchte eine clone methode gebaut.
[Java]
class MeinObjekt implements Cloneable{
....

public MeinObjekt clone1(){
MeinObjekt objektname= null;
try {
objektname= (MeinObjekt ) this.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return objektname;
}
}
[/Java]


diese Methode rufe ich aus einer anderen klasse auf:

[Java]
this.tempcopy=MeinObject.clone1();
[/Java]

Jedoch kopiert er das objekt nicht sonder er verweist nur darauf ;(


wo hat sich mein fehler versteckt? vielen dank
 
Zuletzt bearbeitet:
S

SlaterB

Gast
funktioniert bestens, siehe Test unten,

Paradebeispiel für unvollständige Frage, ohne Testprogramm, ohne Erklärung für 'Jedoch kopiert er das objekt nicht sonder ein verweist nur darauf'

innere referenzierte Objekte werden natürlich übernommen, nicht selber auch noch kopiert,
dafür gibts z.B.
http://www.informatik-student.de/2006/12/10/deep-copy-von-java-objekten/


Java:
public class Test2
{
    public static void main(String[] args)
    {
        MeinObjekt a = new MeinObjekt();
        a.k = 5;
        MeinObjekt b = a.clone1();
        a.k = 6;
        System.out.println("a: " + a.k + ", b: " + b.k);
    }
}

class MeinObjekt   implements Cloneable {
    public int k;

    public MeinObjekt clone1()
    {
        MeinObjekt objektname = null;
        try
        {
            objektname = (MeinObjekt)this.clone();
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return objektname;
    }

}
 

Otz

Bekanntes Mitglied
ahhhh ich verstehe das Problem. Ok...

wenn ich das Objekt clone, erzeugt er mir zwar ein "neues" aber die verweise im "inneren" des objektes zeigen immer noch auf die gleichen objekte wie beim ursprünlichen.

ist bischen wie bei c++ mit den zeigern oder?!
 

Otz

Bekanntes Mitglied
da habe ich nichts mehr beizutragen

ja bedeutet es du stimmst mir zu oder ist es totaler müll?!


ich verstehe jetzt den Fehler jedoch bekomme ich das Problem leider noch nicht gelöst. ich habe es mit der copy/clone methode probiert aber leider funktioniert es immer noch nicht. es ist genau das selbe fehler bild.


wenn ich im geclonten objekt ein attribut ändere, wird dies im ursprünglichen objekt geändert. daraus lässt sich schliesen, dass keine kopie erzeugt wurde sondern eher eine referenz odeR?!
 
S

SlaterB

Gast
zu 'c++ mit den zeigern' kann ich nichts sagen, habe zu wenig c++,
kann aber vermuten dass das selbst dann zu ungenau formuliert wäre, da kann man beliebiges antworten

'funktioniert es immer noch nicht'
was hatte ich noch geschrieben? kein (kompletter) Code, keine Erklärungen im ersten Posting ;)
nun dasselbe..,

ich kann jetzt wieder ein Beispiel zusammenzimmern, verzichte aber doch lieber drauf

den Kopiercode kopieren, die Klasse mit Attributen erweitern, Testmethode usw.,
'schlimmstenfalls' stellst du selber fest, dass es im Standard funktioniert, in deinem Programm aber nicht,

das kann noch kompliziert zu suchen sein, durchaus, aber die Funktionalität an sich im Forum anzuzweifeln hilft dabei ja wenig
 

Otz

Bekanntes Mitglied
bin leider immernoch nicht zum gewünschten ergebnis bekommen:(

ich versuche nun nochmal das problem zu schildern, diesmal mit etwas mehr code ;)

Also Object1 soll kopiert/geclont werden:

[Java]
public class object1{

private CheckBox check = null;
private String name; //only uppercase letters

...(getter/setter)
[/Java]

Object1 befindet sich in einem Container(VaadinFramework), dies sollte aber nichts mit dem Problem zu tun haben
[Java]
class Object1Container....

public Object1Container deepContainerCopy() {

Object1Container cloneContainer = new Object1Container ();

if(cloneContainer.size()!=0) {
cloneContainer.removeAllItems();
}
//Container ist leer!

Object1 runner = new Object1();
runner = (Object1 ) this.firstItemId();

for(int i = 1; i<=this.size();i++){
Object1 cloneType = new Object1 ();
CheckBox check = new CheckBox();
check.setValue(runner.getCheck().getValue());
check.setCaption(runner.getCheck().getCaption());
cloneType.setCheck(check);
cloneType.setNameUpperCase(runner.getNameUpperCase());
cloneContainer.addItem(cloneType);

runner=this.nextItemId(runner);
}
return cloneContainer;
}
[/Java]

[Java]
Object1Container container = new Object1Container();
Object1Container cloneContainer= container.deepContainerCopy();

[/Java]

so, ich hoffe jetzt kann man es etwas besser verstehen und ihr könnt mir bei meinem fehler weiterhelfen
 
Zuletzt bearbeitet:

Crian

Top Contributor
Ich habe für so etwas Copy-Konstruktoren. Wie man das letztlich löst, ist natürlich Geschmackssache. Wichtig ist, dass du alle tieferen Datenstrukturen eben wieder kopieren musst. Daher haben bei mir alle der dort vorkommenden Klasen auch wieder Copy-Konstruktoren, die sich dann wiederum darum kümmern, den Inhalt zu verdoppeln und nicht nur Verweise zu kopieren.
 
S

SlaterB

Gast
das ist vollkommen anderer Code als in meinem Link, wie sollte je irgendjemand dazu etwas geahnt haben können?

auf mich macht das einen zuverlässigen andere-Objekte-Eindruck,
was genau siehst du denn nun als Problem an?

Java:
Object1 ausgangsobject = new Object1();
 
Object1 cloneobject=ausgangsobject.deepContainerCopy();
gibt es die Methode deepContainerCopy() in Object1 oder in Object1Container, oder besteht Vererbung?
bisschen verwirrend,
kommt überhaupt die gepostete Methode dran, gibt es innere Checkboxen usw?
wenn du nur ausgangsobject in einer Zeile erstellst, ist ja nicht so viel Inhalt zu vermuten,

wie auch immer, jetzt wo so viele Details da sind, wo genau liegt denn der vermutete Fehler?
cloneobject wird ja wohl != ausgangsobject sein, oder dort schon ein Problem?
wenn Container, wie sieht es mit den inneren Objekten aus, wo tritt Gleichheit auf, wo genau letzlich ein Problem?

> wenn ich im geclonten objekt ein attribut ändere, wird dies im ursprünglichen objekt geändert.

was genau bedeutet das hier, Value in CheckBox, Name in Object1, oder oder oder?
sind auch keine statischen Attribute betroffen die sich natürlich für alle gleich auswirken?

nur (noch mehr) Details helfen ;)

am besten immer ein vollständiges Testprogramm, siehe mein Beispiel,
main-Methode welche Objekte erstellt, kopiert, evtl. Werte ändert, vergleicht, ALLES dabei,
wenn mit mehreren Unterklassen, dann sicher bisschen schwieriger zu machen, aber hast ja auch alle Zeit der Welt
 

Otz

Bekanntes Mitglied
hab mal versucht deine fragen zu beantworten :)

gibt es die Methode deepContainerCopy() in Object1 oder in Object1Container, oder besteht Vererbung?

ja, sorry war ein fehler von mir. wurde bereits geändert. ist natürlich im container.


kommt überhaupt die gepostete Methode dran, gibt es innere Checkboxen usw?
wenn du nur ausgangsobject in einer Zeile erstellst, ist ja nicht so viel Inhalt zu vermuten,
was meinst du mit innere checkboxen? ob das object ausgansobject checkboxen besitz? ja, es besitz checkbox objecte

wie auch immer, jetzt wo so viele Details da sind, wo genau liegt denn der vermutete Fehler?
naja, wenn ich das wüsste. ich seh nur, dass es nicht das macht was es soll:)

cloneobject wird ja wohl != ausgangsobject sein, oder dort schon ein Problem?
ne, da stimmts noch. also cloneobject!=ausgangsobject=true

> wenn ich im geclonten objekt ein attribut ändere, wird dies im ursprünglichen objekt geändert.
nein

was genau bedeutet das hier, Value in CheckBox, Name in Object1, oder oder oder?
wie gesagt, dass sind eigenschaften von vaadin. value ist ob die checkbox gecheckt oder nicht ist... sollte ja aber nichts mit dem fehler zu tun haben oder?!

nochmal zu meinem problem:

ich hab ne gui in der der inhalt des containers angezeigt werden soll. diese objekte können auch geändert werden. z.b. checkbox checken oder unchecken.

dann gibt es 2 buttons. ok und cancel. ok speichert die änderungen im container und cancel stellt wieder den ausgangszusand her.
deshalb dachte ich mir, wenn ich das fenster erstelle clone ich im konstruktor des fensters den container und wenn anstatt der ok button der cancel button gedrückt wird "lade" ich den im konstruktor geclonten container.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
'vaadin' lese ich jetzt quasi zum ersten Mal, ok früher einmal kurz erwähnt,
keine Ahnung was mit diesen Checkboxen los ist,
vielleicht werden alle die den gleichen Typ/ Value/ Caption haben, was immer das ist, im Hintergrund auf gleiche Weise geändert,
komische Framework-Objekte bieten sich nicht für solche Tests an,
kopiere eigene Dummy-Klassen, Listen, Arrays usw. und erfahre, dass Kopien in der Tat Kopien sind,

was mit deinem Framework ist, kann ich nicht sagen,
GUI-Elemente bieten sich normalerweise auch nicht für Kopien an, z.B. Swing-Buttons auch nicht

wenn dann kopiere nur die Konfigurations-Daten an sich, String name, Position x/y, wiederum in einfachen Java-Objekten,
und lasse daraus auf strukturierten Wege GUI-Elemente erstellen, falls du ähnliche Formulare oder so brauchst
 

Otz

Bekanntes Mitglied
ich denke aber es macht relativ wenig aus ob ich ein framework objekt kopieren will oder ein "normales" oder?!

für beide sollte im großen udn ganzen das selbe gelten.
 
S

SlaterB

Gast
was genau der Fehler ist, das verschweigst du ja weiterhin, ich hatte zuletzt

> wenn ich im geclonten objekt ein attribut ändere, wird dies im ursprünglichen objekt geändert.

von einem deiner früheren Postings kopiert und da schreibst du nun prompt 'nein' dran

wenn die CheckBoxen gleichzeitig in die GUI eingebunden sind, dort durch irgendwelche Prozesse gecheckt werden oder nicht,
kann ich mir vorstellen, dass gleiche Caption, was immer das ist, eine Auswirkung hat,

aber wie gesagt egal, du musst schon sagen was überhaupt das Problem ist
 

Otz

Bekanntes Mitglied
Problem:

wenn ich im geclonten objekt ein attribut ändere, wird dies im ursprünglichen objekt geändert.

nein

aber wenn ich im ursprünglichen element was ändere, ändert es sich im geclonten :)
 
S

SlaterB

Gast
aber was, wie genau, welcher Container, welches Object1, welche CheckBox, welches Attribut darin mit welchem Wert, was für ein Methodenaufruf?

hole dir die beiden Objekte direkt nebeneinander her in zwei Variablen,
CheckBox a = ..;
CheckBox b = ..;
Ausgabe ob es dieselben sind: ==
Ausgabe der Zustände vorher,
welcher Aufruf?
Ausgabe der Zustände nachher,

wenn es ein Framework-Objekt ist, kann man doch gar nicht sagen, was da intern alles passiert,

wie kannst du das mit einem eigenen Dummy-Objekt a la MeinObjekt mit Attribut k aus Posting #2 vergleichen?
nur eigene Objekte zeigen exakt nachvollziehbar das Java-Verhalten: wenn die Objekte != sind, dann kann man selbstverständlich die Attribute einzeln verändern,

was in einem Framework-Objekt wie CheckBox los ist kann man im guten Glauben zunächst als normal annehmen,
ein unerwartetes Verhalten dort hat aber evtl. nichts mit Java an sich zu tun, sondern kann immer durch die interne Implementierung gut begründet sein


edit:
mir fällt auf dass meine Postings langsam 3x so lang werden wie deine, obwohl es andersrum sein sollte,
in dieser Häufung nicht mehr zu vertreten,
wenn du weiter nur einzelne Sätze postest werde ich wohl gezwungen sein, auch nur noch 'ja aber Java geht' zu antworten,
falls damit geholfen ist..
 
Zuletzt bearbeitet von einem Moderator:

Otz

Bekanntes Mitglied
ich glaube wirklich du hast recht :)

ich habe mir jetzt die beiden objekte geholt und verglichen sind beide !=
genauso bei den checkboxen. die sind auch !=
meine deepCopy methode sollte also funktionieren.


da muss wohl noch irgendwsa im hintergrund ablaufen was ich (noch) nicht herausgefunden habe.

ich werde wohl noch etwas herumprobieren müssen.



sorry dass mein beitrag nicht größer als deiner geworden ist, es gibt eben nicht mehr zu berichten ;) sollte ich eine lösung gefunden haben, werde ich auch mehr von mir geben können.
Danke für die Gedult und Hilfestellungen ich meld mich wenns was neues gibt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Cloneable Java Basics - Anfänger-Themen 1
R Frage zum Cloneable-Interface Java Basics - Anfänger-Themen 9
J Probleme mit drucken aus Java Java Basics - Anfänger-Themen 3
R Exceptions mit try-catch-Surrounding - Probleme Java Basics - Anfänger-Themen 6
D Probleme bei Verwendung short und int im Constuctor Java Basics - Anfänger-Themen 6
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
B Quiz mit RMI Probleme mit RMI start Java Basics - Anfänger-Themen 4
httprt Probleme bei dem erstellen von leveln in meinem Spiel Java Basics - Anfänger-Themen 2
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
R JMenu/JMenuItem Probleme Java Basics - Anfänger-Themen 2
B Static vs non static und Probleme daraus Java Basics - Anfänger-Themen 13
J Probleme mit dem Debugger Java Basics - Anfänger-Themen 4
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
J Probleme mit Kompilierung Java Basics - Anfänger-Themen 11
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
C Probleme mit dem Erstellen und Importieren von Packages Java Basics - Anfänger-Themen 6
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
R Erste Schritte Probleme bei 2D Spielfeld, mit einzufügender "Person" Java Basics - Anfänger-Themen 5
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
Dimax String Probleme Java Basics - Anfänger-Themen 12
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
J Probleme bei IllegalArgumentException "werfen". Java Basics - Anfänger-Themen 1
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
D Probleme mit dem Windowbuilder und JComboBox Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
X Probleme mit Übungsaufgaben zu Zahlentypen Java Basics - Anfänger-Themen 4
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
T Probleme bei Installation von JDK Java Basics - Anfänger-Themen 2
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
C Probleme bei Regex Java Basics - Anfänger-Themen 9
V Probleme mit Arrays Java Basics - Anfänger-Themen 8
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
L Probleme mit Java Java Basics - Anfänger-Themen 3
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
I Probleme mit 2 dimensionale Arrays Java Basics - Anfänger-Themen 3
H Best Practice View probleme Java Basics - Anfänger-Themen 2
B Probleme mit Kreisberechnung Java Basics - Anfänger-Themen 15
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
BlueFox Tabelle in der Konsole ausgeben - Probleme Java Basics - Anfänger-Themen 1
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2
V Klassen ObjectInputStream ->ReadObject Probleme Java Basics - Anfänger-Themen 5
P Probleme mit der Do-Schleife Java Basics - Anfänger-Themen 2
F Erste Schritte Compiling Probleme Java Basics - Anfänger-Themen 13
S Neuling und Probleme bei Schulaufgabe Java Basics - Anfänger-Themen 5
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
M Array mit eigenem Datentyp probleme beim übergeben Java Basics - Anfänger-Themen 6
M Probleme mit Eclipse Java Basics - Anfänger-Themen 20
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
S Compiler-Fehler javac hat Probleme mit Paketen unter OSX Java Basics - Anfänger-Themen 2
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
B Variablen Probleme mit Eclipse Java Basics - Anfänger-Themen 6
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
I Probleme bei Verzeichnissanalyse Java Basics - Anfänger-Themen 12
F Probleme mit privaten Klassen (abstrakten Klassen) Java Basics - Anfänger-Themen 1
H Probleme mit Klassen...oder: Eine Uhr Java Basics - Anfänger-Themen 9
G Probleme mit Konsole Java Basics - Anfänger-Themen 4
S Probleme mit GamGrid Spiel-Erstellung => Actor reagiert nicht auf Tastatur Java Basics - Anfänger-Themen 2
G Probleme mit Eclipse oder der URL Klasse Java Basics - Anfänger-Themen 5
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
M Probleme mit Anzeigen von String in GUI und if-Anweisung Java Basics - Anfänger-Themen 9
T Konstruktor Probleme Java Basics - Anfänger-Themen 3
W Methoden Probleme mit der Scanner Methode Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben