Eliminare un oggetto in java?


99

Voglio eliminare un oggetto che ho creato, (un ovale che ti segue), ma come dovrei farlo?

delete follower1;

non ha funzionato.

MODIFICARE:

Ok, fornirò un po 'più di contesto. Sto facendo un piccolo gioco con un ovale che puoi controllare e un ovale che ti segue. Ora ho file denominati: DrawPanel.class, questa classe disegna tutto sullo schermo e gestisce collisioni, suoni, ecc. Ho un nemico.class, che è l'ovale che segue il giocatore. Ho una entity.class, che è il giocatore che puoi controllare. E se il giocatore si interseca con il follower, voglio che il mio oggetto giocatore venga eliminato. Il modo in cui lo sto facendo:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
puoi fornire un po 'più di contesto?
Joseph Weissman

2
Non vi è alcuna cancellazione di oggetti in Java. Ma normalmente non è necessario: ciò di cui hai bisogno è assicurarti che non sia più mostrato nulla sullo schermo (se questo è ciò che sta facendo "seguirti").
Paŭlo Ebermann

Forse vuoi provare a forzare il garbage collector a rimuovere un oggetto? v'è una domanda su di esso qui già. O forse stai provando qualcos'altro? puoi provare a leggere un po 'del garbage collector qui o qui Se continua a non essere d'aiuto, dovrai essere più specifico.
Fawix


Se vuoi davvero davvero gestire manualmente le allocazioni degli oggetti, usa JNI: crea una libreria C / C ++ che viene utilizzata dal codice Java ma fa tutto (crea, cancella, ecc.) Da solo, ma all'interno della tua libreria hai C / Codice C ++, no Java. Non ho visto alcun modo per eliminare manualmente un oggetto Java. Se il tuo profiler ti dice che ci sono problemi, questi problemi spesso si basano su riferimenti "dimenticati" agli oggetti. Nel tuo caso non sembra esserci alcun problema da nessuna parte.
Johannes

Risposte:


171

Dovresti rimuovere i riferimenti ad esso assegnando null o lasciando il blocco dove è stato dichiarato. Dopodiché, verrà automaticamente eliminato dal garbage collector (non immediatamente, ma alla fine).

Esempio 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Esempio 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

Non qualcosa che stai attualmente cercando, ma FYI: puoi invocare il garbage collector con la chiamata System.gc ()


23
Dover chiamare manualmente in System.gc()genere non è una buona idea , poiché potrebbe effettivamente essere ignorato dalla JVM.
cdeange

3
Non è una buona idea, ma puoi anche chiamare simile a System .. Runtime.getRuntime (). Gc (). Ulteriori informazioni: le routine di garbage collection fornite da Java sono membri della classe Runtime. La classe Runtime è una classe speciale che ha un singolo oggetto (un Singleton) per ogni programma principale. L'oggetto Runtime fornisce un meccanismo per comunicare direttamente con la macchina virtuale. Per ottenere l'istanza Runtime, puoi utilizzare il metodo Runtime.getRuntime (), che restituisce Singleton.
Timo

1
L' nullassegnazione è un segno preciso al GC che questo oggetto deve essere Garbaged Cleaned nella successiva chiamata GC? * L'assegnazione nulla oggetti di raccolta (elenchi, array) li contrassegna per la pulizia? stackoverflow.com/questions/449409/...
George Daramouskas

Quindi dovrei rendere nulle tutte le mie visualizzazioni di testo e i pulsanti immagine in onPause?
Ruchir Baronia

Non vi è alcuna garanzia che il garbage collector verrà mai eseguito o che, in tal caso, raccoglierà (non "cancellerà") alcun oggetto specifico.
Marchese di Lorne

64

Il tuo C ++ sta mostrando.

Non è presente deletein java e tutti gli oggetti vengono creati nell'heap. La JVM dispone di un Garbage Collector che si basa sui conteggi dei riferimenti.

Quando non ci sono più riferimenti a un oggetto, diventa disponibile per la raccolta da parte del garbage collector.

myObject = nullpotrebbe non farlo; per esempio:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Tutto ciò che fa è impostare il riferimento myObjecta null, non ha effetto sull'oggetto myObjectuna volta puntato tranne che per decrementare semplicemente il conteggio dei riferimenti di 1. Poiché myOtherObjectsi riferisce ancora a quell'oggetto, non è ancora disponibile per essere raccolto.


Quindi dovrei rendere nulle tutte le mie visualizzazioni di testo e i pulsanti immagine in onPause?
Ruchir Baronia

8
"La JVM ha un garbage collector che si basa sul conteggio dei riferimenti." -> questa è una spiegazione molto semplificata. Controlla se gli oggetti sono raggiungibili da una specifica "radice"
Johannes

2
La JVM dispone di un garbage collector che specificamente non si basa sui conteggi dei riferimenti. Si basa sulla raggiungibilità. Se si basasse sui conteggi di riferimento non potrebbe mai raccogliere cicli, e lo fa.
Marchese di Lorne

14

Se vuoi aiutare un oggetto a scomparire, imposta il suo riferimento su null.

String x = "sadfasdfasd";
// do stuff
x = null;

L'impostazione del riferimento su null renderà più probabile che l'oggetto venga sottoposto a garbage collection, a condizione che non vi siano altri riferimenti all'oggetto.


Ogni volta che lo faccio, quando il mio oggetto si interseca, tutto il mio gioco si blocca e non cancella l'oggetto.
Stan

Perché probabilmente stai generando un'eccezione di puntatore nullo non rilevata. Un contesto più ampio ci aiuterebbe sicuramente a guidarti in questo.
Joseph Weissman

Quindi dovrei rendere nulle tutte le mie visualizzazioni di testo e i pulsanti immagine in onPause?
Ruchir Baronia

Se hai davvero bisogno che se ne vadano, alla fine lo farebbe.
John Percival Hackworth,

3

Non è necessario eliminare oggetti in java. Quando non è presente alcun riferimento a un oggetto, verrà raccolto automaticamente dal Garbage Collector.


Quindi dovrei rendere nulle tutte le mie visualizzazioni di testo e i pulsanti immagine in onPause?
Ruchir Baronia

0

È possibile rimuovere il riferimento utilizzando null.

Diciamo che hai lezione A:

A a = new A();
a=null;

l'ultima istruzione rimuoverà il riferimento dell'oggetto ae tale oggetto verrà "raccolto in modo indesiderato" da JVM. È uno dei modi più semplici per farlo.


Quindi dovrei rendere nulle tutte le mie visualizzazioni di testo e i pulsanti immagine in onPause?
Ruchir Baronia


-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}

Il motivo per cui questa risposta non è corretta è perché rimuove solo un riferimento all'Oggetto e non l'oggetto effettivo stesso.
Ben Morris

Il motivo per cui questa risposta non è corretta perché mostra come rimuovere un oggetto da un elenco: non era questa la domanda.
phil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.