Objekt zur Laufzeit zerstören?

Rockstady

Mitglied
Hallo zusammen,

ich habe leider keine Ahnung, wie ich mein Problem lösen soll und hoffe mal, dass ich die Begriffe auch korrekt verwende.

Ich schreibe derzeit ein Spiel, habe dafür eine Menü-Klasse, die ein Menü darstellt und auch die Navigation hierfür vornimmt. Wenn der Spieler nun auf den Punkt „Training“ fährt und diesen auswählt, wird ein neues Objekt der Klasse „Training“ erstellt. Dann läuft der Code da drin ab und irgendwann ist das Training vorbei und der Spieler sollte wieder zum Menü zurückkehren können.
Wie verlasse ich hierbei nun korrekt meine Klasse Training und komme zum Menü zurück? Ich würde das Objekt einfach zerstören wollen, mit „me.kill“ oder so was. Ist dieses Vorgehen so korrekt?

Falls noch wichtige Informationen fehlen, kann ich diese gerne nachreichen.

Grüße Rockstady
 
Oder mit anderen Worten: Wenn keine Referenz mehr auf ein Objekt existiert, kommt das Objekt auf die Kill Liste, welche vom Garbage Collector je nach Lust und Laune abgearbeitet wird.
 
Dies wird in Java vom Garbagecollector übernommen.
Um die Sache zu beschleunigen, kannst du die "Zerstörung" durch den
Garbagecollector mit objektname = null beschleunigen.

Edit: Bisschen zu spät
 
Woah, danke für die schnellen Antworten, coole Sache.

Ok, verstehe, aber trotzdem, kann sein, dass ich gerade bisschen auf dem Schlauch stehe, aber wie verlasse ich mein "Trainings"Objekt denn nun?
Ich habe nur 1 Fenster und zeichne dort alles rein, wenn das Objekt "Training" existiert, wird primär davon alles gezeichnet und das Menü nicht mehr beachtet.
Wie komm ich vom Code her aber nun auf das eigentliche Menü zurück?

Ich habe in jeder Klasse die Methoden init, calc und draw. Wenn ich "Training" auswähle, werden diese Methoden vom Menü alle an das Objekt weitergegeben. Das Menü läuft praktisch parallel weiter. Ich hoffe es ist verständlich, was ich meine. 🙂
 
Ich würde das Objekt einfach zerstören wollen, mit „me.kill“ oder so was
und dann?

Wie killen? Ich würd einfach aufhören...

Java:
public class Training implements Runnable {
   
   private long ende;
   
   public Training(int dauerInMinuten){
     this.ende = System.currentTimeMillis() + dauerInMinuten*60*1000;
   }

   @Override
   public void run() {
      while(System.currentTimeMillis()< ende){
         System.out.println("trainiere!");
         try {
            Thread.sleep(5000);
         } catch (InterruptedException e) {}
      }
      System.out.println("training beendet");
      
   }

}
 
Ich hoffe es ist verständlich, was ich meine.
Ne du 😉

Also erstens:
Was du hier erreichen willst hast nix mit den Antworten zu tun, die dir gegeben wurden. Das liegt aber nicht an der Doofheit der Poster, sondern an dem unglücklich gewählten Thread-Titel.
*edit: muss nicht unbedingt auf ardauer's neue Posts zutreffen, wir haben hier gleichzeitig gepostet

Vergiss das mal mit der Garbage Collection - es stimmt was dir hier darüber erzählt wurde, hat aber wie gesagt nichts mit deinem Problem hier zu tun.

Dein Problem hat vllt etwas mit Threads zu tun, aber auch da bin ich mir nicht sicher.
Vllt verstehst du einfach nicht wie ein Programm abgearbeitet wird.
Poste mal bitte eine Art Pseudo-Code wie das bei dir abläuft.
Oder meinetwegen gleich den Code aus deinem Programm, solange es nicht zu viel ist.

lg
 
Ich versuchs mal in Kurzfassung, Code gekürzt, ist also klar, dass es so direkt nicht funktioniert:

Main-Klasse:

Java:
    public void run() {
        while (running) {
            long start = System.currentTimeMillis();
            try {
                if (!pause) {
                    tickCount++;
                    game.calc(tickCount);
                }

Game:

Java:
    @Override
    public void calc(int tickCount) {
                menue.calc(tickCount);
    }

Menü:

Java:
                    case KeyEvent.VK_SPACE:
                        switch (zustand) {
                            case 1:
                                status = 1;
                                training = new Training();
                                break;

Training:

Java:
    public void calc(int tickCount) {
        switch (status) {
            case 1:
                switch (zustand) {
            case 3:
                // Training wird beendet;
                // Nur wie?

So, ich hoffe es passt so.

@hdi: Nur kurz zum klarstellen, von Doofheit von irgendjemand habe ich nie was gesagt und werd es auch nicht tun. Mir ist bewusst, dass ich mich nicht in perfektem Java-Deutsch ausdrücken kann. 😳
 
@hdi: Nur kurz zum klarstellen, von Doofheit von irgendjemand habe ich nie was gesagt und werd es auch nicht tun. Mir ist bewusst, dass ich mich nicht in perfektem Java-Deutsch ausdrücken kann.

Das wollte ich damit auch nicht ausdrücken! Ich hab das dazu geschrieben um meinen Text zu rechtfertigen - damit also die anderen nicht auf mich sauer werden 😉

Nun zum Code:
So ganz blick ich da noch immer nicht durch.
Der Zustand wird durch den tickCount gewechselt, oder wie? Mir fehlt hier die calc Methode des Menüs, was passiert da?
Ich weiss auch nicht was du eigentlich meinst mit "Beenden" des Trainings. Was soll das heißen? Was passiert eigentlich in deinem Programm, außer dass non-stop game.calc() aufgerufen wird?

(Ich hoffe übrigens du hast da noch ein sleep dazwischen in deinem while-loop der Main-Klasse?)

EDIT: weisst du was ich hab das gefühl das ist so ein Thread wo wir erstmal noch 5 Stunden aneinander vorbeireden werden 😉
Poste am besten doch mal den gesamten Code. Es werden ja wohl nicht 74 Klassen mit jeweils 530 Zeilen Code sein oder? Falls doch: Vergiss was ich grad gesagt hab, dann müsstest du's besser per mail schicken.
 
Zuletzt bearbeitet:
läuft Training in einem eigenen Thread?
hast du sowas auch in Training?
Java:
 public void run() {
        while (running) {

dann einfach running auf false setzen. der thread läuft aus der run raus und wird automatisch beendet und gekillt.
 
Besten Dank an hdi! Er stand mir gestern eine Weile zur Hilfe und mein Problem konnte gelöst werden. Die Themenbezeichnung war hier etwas unglücklich gewählt, da es mit dem Garbage Collector nur am Rande etwas zu tun hat.
Ich ändere nun im Training den Status des Menü ab, so dass das Training nicht mehr angezeigt wird. Das Objekt besteht zwar weiterhin, aber wird nicht mehr weiter beachtet und beim nächsten Aufruf wird es überschrieben.

Also nochmals besonderen Dank an hdi und alle, die hier so schnell geantwortet haben!!! Bei weiteren Fragen wird dies mit Sicherheit meine erste Anlaufstelle sein. :toll:
 
Gern geschehen, aber nur damit das klar ist:

Das Objekt besteht zwar weiterhin, aber wird nicht mehr weiter beachtet und beim nächsten Aufruf wird es überschrieben.
Das habe ich nicht gesagt 😉 Du überschreibst nicht das Objekt - sowas geht nicht (explizit) - , du überschreibst die Referenz in der Variablen. Das führt nur dazu, dass dein altes Trainings-Objekt nicht mehr referenziert wird, d.h. es ist nicht mehr durch eine Variable ansprechbar. In so einem Fall wird es vom GC geschnappt, das kann aber erst ne Weile nach der Neu-Referenzierung deiner Trainings-Variablen mit dem neuen Trainnigs-Objekt sein
 

Zurück
Oben