2010-11-20 6 views
1

Also in meinem Programm habe ich mehrere verschiedene Objekte in einem Array gespeichert. Ich erzeuge zufällig eine Zahl, die ein Index in das Array ist, und klon das Objekt (neun Mal), um ein 3x3 Raster von Objekten auf meinem Bildschirm zu erzeugen.Löschen von Objekten in Java

Jetzt ist mein Problem, nachdem ich meine 3x3 Gitter habe ich möchte in der Lage sein, das zu löschen und ein neues Gitter von Objekten in dem Array zu generieren. Das Problem ist, dass ich mir nicht vorstellen kann, wie ich all diese Klone loswerden kann, außer sie einfach aus dem Display zu entfernen, was wie eine Verschwendung von Erinnerungen erscheint. Ich möchte 400 Versuche machen, also wären am Ende viele geklonte Objekte.

Gibt es eine Möglichkeit, diese geklonten Objekte zu löschen? Ich muss neue Objekte erstellen, weil es möglich ist, dass eines der Objekte in meinem Array zweimal im Raster verwendet wird.

+0

Sie sollten die Anzeige von der Logik trennen. Dann wird dies zu einem Nicht-Problem.(Auf einem modernen System ist es wahrscheinlich kein Problem, auch wenn icky und conflating Konzepte.) –

Antwort

2

Ich denke, dass Java Garbage Collector es für Sie tun wird. Wenn ein Objekt von niemandem referenziert wird, wird es gelöscht, wenn das System dies erkennt; aber was meinst du, wenn du sagst "verschiebe sie aus dem display"? Wenn sie ein "graphisches Objekt" sind, sollten sie sich in einem anderen Objekt (wie JFrame) befinden, also müssen Sie eine Methode verwenden, um dem JFrame-Objekt (oder anderem) mitzuteilen, dass die Referenz entfernt oder die Referenz durch eine andere überschrieben wird.

0

Es hilft zu erkennen, dass es sich nicht um tatsächliche Objekte handelt, sondern um Zeiger oder Referenzen auf Objekte im Speicher. Also:

Object obj = new Object(); 

ist kein Objekt, sondern eine Verknüpfung zu einem Objekt im Speicher. Wenn Sie den Link entfernen, indem Sie ihn auf null setzen oder ihn durch einen Link zu einem anderen Objekt ersetzen, wird das alte Objekt gelöscht ... ish. Wenn die Garbage Collection ausgeführt wird, wird sie gelöscht. Also:

obj = null; 

und

obj = new Object(); 

wird im Wesentlichen das alte Objekt löschen. Dasselbe gilt für ein Array von Objekten. Sie haben es nicht mit einem Array von tatsächlichen Objekten zu tun, sondern mit einem Array von Links zu Objekten. Wenn Sie also eine Position in einem Array auf null setzen oder eine Position für ein neues Objekt festlegen, wird das alte Objekt gelöscht. Also:

ObjArray[4] = null; 

und

ObjArray[4] = new Object; 

Wird das alte Objekt löschen.

Edit: Etwas, das ich vergessen zu erwähnen, Ein einzelnes Objekt im Speicher kann mehrere Links zu ihm haben und es ist nicht, bis all diese Links entfernt werden, dass das Objekt in der Lage ist, durch Garbage Collection gelöscht werden.

Object obj = new Object(); 
ObjArray[4] = obj; 
obj=null; 

Im obigen Fall, das Objekt, das ursprünglich erstellt wurde, wird nicht gelöscht, wenn obj auf null gesetzt ist, ist dies, weil ein Link, um es noch in der ObjArray existiert. Sie müssen sowohl obj als auch ObjArray [4] auf null setzen, bevor das Objekt verschwunden ist.

+0

Danke, aber aus irgendeinem Grund, wenn ich den Code: Target t = new Target (x, y); t = null; Dann, wenn auf meinem Display die Grafik immer noch angezeigt wird, gibt es also eine Möglichkeit, den Müllsammler zu zwingen, seine Arbeit oder etwas zu tun? – Douglas

+0

@ Douglas Getrennte Bedenken. Dann wird das Sinn machen. –

+0

@Douglas, fügte ein wenig mehr zu meiner Antwort über mehrere Referenzen hinzu. – phill

0

Weil die Referenz immer noch im Container bleibt. Ich denke, du hast so etwas wie gemacht: myJFrameObject.getContentPane.add (object_to_display); Der Verweis befindet sich also in myJFrameObject. Sie können beispielsweise myJFrameObject.getContentPane.remove verwenden. Wenn Sie möchten, können Sie setVisible (false) verwenden, um den Rahmen auszublenden. Es hängt von der Situation ab.