Gleiche Objektreferenz trotz clone()?

renwal

Aktives Mitglied
Hallo!

Ich brauche mal eure Hilfe beim Lösen folgenden Problems: In einem Quiz-Programm erzeuge ich eine Variable namens
Code:
currentQuestion
, die immer auf die aktuell angezeigte Frage verweist, die wiederum aus einem Array geladen wird.
Nun versuche ich, eine neue Frage zu laden, während ich in einem anderen Thread quasi die Aufräumarbeiten erledige. Während dem Laden der neuen Frage ändert sich auch die Referenz der Variable currentQuestion. Um deshalb aber keine Probleme mit dem Aufräum-Thread zu bekommen, der sich ja des "alten" Fragen-Objekts bedient, erstelle ich einen Klon von currentQuestion namens
Code:
oldCurrentQuestion
und übergebe diesen dem Aufräum-Thread.
Der Effekt ist dabei, dass das Klonen keinen Einfluss zu haben scheint. Sobald ich der Variable currentQuestion ein neues Objekt zuweise, ändert sich gleichermaßen die Referenz von oldCurrentQuestion. Ergebnis: Es fliegen reihenweise Exceptions und das GUI friert ein.

Um einen Rat wie das Problem zu lösen ist wäre ich euch sehr dankbar!

LG renwal
 

Fab1

Top Contributor
Hi,

schaue dir mal folgendes (Java Insel) dazu an. Ich denke in dem Satz:
Felder erlauben standardmäßig clone(). Speichern die Arrays jedoch nicht-primitive Werte, liefert clone() nur eine flache Kopie, was bedeutet, dass das neue Feldobjekt, der Klon, die exakt gleichen Objekte wie das Original referenziert und die Einträge selbst nicht klont.

Steht das Problem beschrieben. :)

Weiteres siehe Link.
 

bERt0r

Top Contributor
Das "Aufräumen" sollte eigentlich der Garbage Collector für dich übernehmen, da musst du keinen extra Thread dafür schreiben...
 

renwal

Aktives Mitglied
Hi!

Danke schon einmal für die Antworten. Leider bin ich durch den Artikel nicht wirklich weitergekommen. Besagtes shallow copy-Problem kannte ich. Nur verstehe ich nicht, wo Besagtes bei meinem Code auftreten soll. Ich habe mal so in etwa reproduziert und auf das Kernproblem reduziert, was ich tue:

Java:
// Die Variable mit der aktuellen Frage
Question currentQuestion = null;
// ArrayIterator ist eine Klasse, die es mir ermöglicht, Arrays in Iterator-ähnlicher Weise zu verarbeiten
ArrayIterator questions = new ArrayIterator(new Question[]{frage1, frage2, frage3});

// Methode, die eine neue Frage lädt
private void showQuestion()
{
    if (currentQuestion != null)
    {
        // Die aktuelle Frage klonen
        final Question oldCurrentQuestion = currentQuestion.clone();
        // Den Cleanup-Thread erzeugen und starten
        new Thread("cleanup")
        {
            public void run()
            {
                // Hier wird das Objekt oldCurrentQuestion benutzt (z.B. oldCurrentQuesion.getUIComponents(), etc.)
                // GUI aufräumen, Datenstrukturen verarbeiten, Berechnungen durchführen
            }
        }.start();
    }
    // Die neue Frage setzen
    currentQuestion = questions.next();
    // GUI erzeugen, etc.
}

@bERt0r: Das meinte ich mit "Aufräumarbeiten", siehe Z.19.
 

Michael...

Top Contributor
Das Vorgehen hört sich irgendwie nach einer Verzweiflungstat an. Und inwiefern ein clone() bei Deinem Problem helfen soll ist mir auch nicht ganz klar ( helfen tut es ja ohnehin nicht)

Hierzu:
Sobald ich der Variable currentQuestion ein neues Objekt zuweise, ändert sich gleichermaßen die Referenz von oldCurrentQuestion. Ergebnis: Es fliegen reihenweise Exceptions und das GUI friert ein.
Nur weil man eine von zwei Variablen, die zuvor auf das selbe Objekt referenzieren, auf ein neues Objekt referenzieren lässt, wird die Referenz der zweiten Variable nicht automatisch mit umgebogen.
Da muss was ganz anderes passieren.
 

D4rkscr43m

Bekanntes Mitglied
wie sieht denn die
Code:
Question#clone
Methode aus? Vielleicht wird da ein Internes Objekt nicht geklont sondern 1zu1 in das neue Question-Objekt geschrieben?
 

renwal

Aktives Mitglied
Naja, Michael hat Recht, etwas Anderes ist mir wirklich nicht mehr eingefallen.

Aufgeräumt wird das GUI, während die neuen Objekte im Hauptthread schon erzeugt werden. Außerdem kümmert sich der zusätzliche Thread um all die Aufgaben, die in der Speicherverwaltung in den Fragenobjekten anfallen. Es müssen z.B. die Verknüpfungen zwischen den Container- und GUI-Objekten entfernt werden und Variablen in diesen Container-Objekten aktualisiert werden.

Die Clone-Methode der Question-Klasse ist folgende:
Java:
@Override
public Evaluatable doClone() throws CloneNotSupportedException
{
    return (Evaluatable) this.clone();
}
 

Volvagia

Top Contributor
Benutzt du Swing? Dann ist es keine gute Idee einen separaten Thread dafür zu verwenden. Ich verstehe auch nicht warum, den neuen Thread zu starten kostet wahrscheinlich mehr Zeit als ein paar GUI-Referencen zu kappen.

Du hast currentQuestion.
Dann lädst du eine neue Frage, also currentQuestion = questions.next();
Wäre das dann nicht einfacher?

Java:
Question oldQuestion = currentQuestion;
//Thread
currentQuestion = questions.next();?

Dann steht in oldQuestion die Frage zum Aufräumen und in currentQuestion die nächste/aktuelle Frage.
 

FArt

Top Contributor
Aufgeräumt wird das GUI, während die neuen Objekte im Hauptthread schon erzeugt werden. Außerdem kümmert sich der zusätzliche Thread um all die Aufgaben, die in der Speicherverwaltung in den Fragenobjekten anfallen. Es müssen z.B. die Verknüpfungen zwischen den Container- und GUI-Objekten entfernt werden und Variablen in diesen Container-Objekten aktualisiert werden.

Und das ist so aufwendig, dass es in einem eigenen Thread (nicht Main-Thread und nicht EventQueue) augelagert werden muss? Wie lange brauchst du denn dafür?
Und warum überhaupt? Sinnvollerweise hast du doch ein Datenmodell (z.B. pro Frage). Wenn das nicht mehr referenziert wird, wird es auch collected. In der Regel gibt es da nicht viel zu tun.
Der richtige Ansatzpunkt für das Problem wäre wohl ein ordentliches Design deiner Datenstruktur in Verbindung mit der GUI.
 

renwal

Aktives Mitglied
Erst einmal sorry, dass das so lange gedauert hat! :oops:

FArt hat gesagt.:
Und das ist so aufwendig, dass es in einem eigenen Thread (nicht Main-Thread und nicht EventQueue) augelagert werden muss? Wie lange brauchst du denn dafür?
Da hängt ein Animationssystem drin. Damit beide Animationen möglichst gleichzeitig laufen können, wird die eine im Hintergrund gestartet und das GUI wird aufgeräumt, während der Hauptthread noch die neuen Daten lädt.

FArt hat gesagt.:
Sinnvollerweise hast du doch ein Datenmodell (z.B. pro Frage). Wenn das nicht mehr referenziert wird, wird es auch collected. In der Regel gibt es da nicht viel zu tun.
Der richtige Ansatzpunkt für das Problem wäre wohl ein ordentliches Design deiner Datenstruktur in Verbindung mit der GUI.
Ich verstehe die Formulierung nicht ganz. Ein Datenmodell existiert ja, ich speichere ja nicht irgendwo planlos Bytes. Es geht ja auch nicht darum, dass es nicht collected wird, sondern einfach nur, dass das Original und die Kopie des Objektes irgendwie immer noch "verbunden" sind, d.h. eine Änderung des einen zieht eine Änderung des anderen mit sich.
 

FArt

Top Contributor
Du hast den Wink "keine weiteren Antoworten" nicht verstanden. Folge doch mal dem Link meiner Signatur.

Es wurde bereits von verschiedenen Seiten dezent darauf hingewiesen, dass dein Vorgehen seltsam und unnötig ist. Es bringt dir also nicht, an dem Symptom herumzuknubbeln. Dein Herangehensweise ist falsch.

Mit den bisher gelieferten Informationen sehe ich keinen Grund hier z.B. Objekte klonen zu müssen oder "Aufräumarbeit" erledigen zu müssen.

Halte dich an den Standard zur Programmierung zu Swing GUIs. Stößt du auf ein Problem, dann melde dich damit hier im Forum. Aber nicht mit einem Problem zu einem von dir warum auch immer eingeführten Workaround.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
bueseb84 Gleiche Maven Versions in Child Modulen Allgemeine Java-Themen 13
parrot Gleiche Buchstaben Aufage Allgemeine Java-Themen 40
M ZipOutputStream gleiche Datei andere Größe? Allgemeine Java-Themen 0
T Gleiche Operation dauert teilweise sehr lange Allgemeine Java-Themen 12
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G Gleiche Packages in verschiedenen JAR Dateien - Welches Package wird verwendet? Allgemeine Java-Themen 5
M HashSet<String> das selbe oder das gleiche? Allgemeine Java-Themen 4
J Gleiche Packagestruktur in zwei *.jar Dateien Allgemeine Java-Themen 4
M Die gleiche Klasse in mehreren JAR files Allgemeine Java-Themen 5
B Liste auf gleiche Elemente untersuchen? Allgemeine Java-Themen 2
V String formatiert ausgeben ( gleiche Anzahl von Ziffern ) Allgemeine Java-Themen 5
E ArrayList referenziert immer auf das gleiche Objekt Allgemeine Java-Themen 2
nrg Leere Objektreferenz mit != null vergleichen Allgemeine Java-Themen 4
ruutaiokwu objektreferenz eines strings... Allgemeine Java-Themen 9
R Garbage Collection bei gegenseitiger Objektreferenz Allgemeine Java-Themen 2
J Erste Schritte Java 8 Tutorials trotz Java 13 Allgemeine Java-Themen 22
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
V Applet trotz Ausnahme blockiert Allgemeine Java-Themen 0
G Nullpointer trotz vorherigem Nullcheck Allgemeine Java-Themen 2
D JSF Primefaces Chatproblem trotz 3.4 Allgemeine Java-Themen 13
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
T SecurityException trotz signierten JAR? Allgemeine Java-Themen 11
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
B Input/Output Datei noch geöffnet trotz Close Allgemeine Java-Themen 4
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
R java in der konsole nicht gefunden trotz jre,jdk,home und path Allgemeine Java-Themen 4
D Java Heap error trotz anpassungen mit -xmx Allgemeine Java-Themen 4
S Fenster "verschwindet" nicht, trotz setVisible(false); Allgemeine Java-Themen 22
M Radianwert wiederholt sich trotz unterschiedlicher zufälliger Koordinaten Allgemeine Java-Themen 6
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
B Trotz fat_jar NoClassDefFounError Allgemeine Java-Themen 4
H2SO3- Date "18.11.2002 20:02:33" trotz Locale.GERMAN nic Allgemeine Java-Themen 9
T Security-Exception trotz gegebener Rechte? Allgemeine Java-Themen 3
Saxony Blocked GUI trotz Thread(s) Allgemeine Java-Themen 2
G Leere Datei mit PrintWriter trotz flush und close Allgemeine Java-Themen 8
X Softwareverkauf trotz Lizens Allgemeine Java-Themen 5
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
P Trotz setModal, der JDialog ist nicht modal ? Allgemeine Java-Themen 18
A Kein finally ausführen trotz verlassen des try blocks? Allgemeine Java-Themen 14
G JFileChooser öffnet sich nicht im Browser ( trotz Signatur ) Allgemeine Java-Themen 10
R Bild wird trotz allem einfach nicht angezeigt. - AHHHHH!!!!! Allgemeine Java-Themen 30
M Bild wird trotz MediaTracker nicht oder nur halb gezeichnet Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben