Supprimer un objet en java?

99

Je souhaite supprimer un objet que j'ai créé (un ovale qui vous suit), mais comment procéder?

delete follower1;

n'a pas fonctionné.

ÉDITER:

D'accord, je vais donner un peu plus de contexte. Je fais un petit jeu avec un ovale que vous pouvez contrôler, et un ovale qui vous suit. Maintenant j'ai des fichiers nommés: DrawPanel.class, cette classe dessine tout sur l'écran, et gère les collisions, les sons, etc. J'ai un ennemi.class, qui est l'ovale qui suit le joueur. J'ai un entity.class, qui est le joueur que vous pouvez contrôler. Et si le joueur croise le suiveur, je veux que mon objet joueur soit supprimé. La façon dont je le fais:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}
Stan
la source
1
pouvez-vous fournir un peu plus de contexte?
Joseph Weissman
2
Il n'y a pas de suppression d'objets en Java. Mais vous n'en avez normalement pas besoin: ce dont vous avez besoin est de vous assurer que rien ne s'affiche plus à l'écran (si c'est ce que fait "vous suivre").
Paŭlo Ebermann
Peut-être voulez-vous essayer de forcer le garbage collector à supprimer un objet? il y a déjà une question à ce sujet ici . Ou peut-être essayez-vous autre chose? vous pouvez essayer de lire un peu plus sur le ramasse-miettes ici ou ici. Si cela ne vous aide toujours pas, vous devrez être plus précis.
Fawix
duplication possible de la suppression explicite
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Si vous voulez vraiment vraiment gérer manuellement les allocations d'objets, utilisez JNI: créez une bibliothèque C / C ++ qui est utilisée à partir du code Java mais fait tout (créer, supprimer, etc.) seule - mais à l'intérieur de votre bibliothèque, vous avez C / Code C ++, pas de Java. Je n'ai vu aucun moyen de supprimer manuellement un objet Java. Si votre profileur vous dit qu'il y a des problèmes, ces problèmes se basent souvent sur des références "oubliées" à des objets. Dans votre cas, il ne semble y avoir de problème nulle part.
Johannes

Réponses:

172

Vous devez supprimer les références en lui attribuant null ou en laissant le bloc où il a été déclaré. Après cela, il sera automatiquement supprimé par le garbage collector (pas immédiatement, mais éventuellement).

Exemple 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

Exemple 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.

Pas quelque chose que vous recherchez actuellement, mais pour info: vous pouvez appeler le ramasse-miettes avec l'appel System.gc ()

MByD
la source
23
Avoir à appeler manuellement System.gc()n'est généralement pas une bonne idée , car il peut en fait être ignoré par la JVM.
cdeange
3
Ce n'est pas une bonne idée, mais vous pouvez également appeler similaire à System .. Runtime.getRuntime (). Gc (). Pour plus d'informations: les routines de garbage collection fournies par Java sont membres de la classe Runtime. La classe Runtime est une classe spéciale qui a un seul objet (un Singleton) pour chaque programme principal. L'objet Runtime fournit un mécanisme pour communiquer directement avec la machine virtuelle. Pour obtenir l'instance Runtime, vous pouvez utiliser la méthode Runtime.getRuntime (), qui renvoie le Singleton.
Timo
1
L' nullaffectation est-elle un signe certain pour le GC que cet objet doit être nettoyé lors du prochain appel du GC? * L'attribution nullà des objets de collection (listes, tableaux) les marque pour le nettoyage? stackoverflow.com/questions/449409/…
George Daramouskas
Je devrais donc rendre toutes mes vues de texte et mes boutons d'image nuls dans le onPause?
Ruchir Baronia
Il n'y a aucune garantie que le garbage collector s'exécutera un jour, ou que, s'il le fait, il collectera (et non «supprimera») un objet spécifique.
Marquis of Lorne
64

Votre C ++ s'affiche.

Il n'y a pas deletede java, et tous les objets sont créés sur le tas. La JVM possède un garbage collector qui repose sur le nombre de références.

Une fois qu'il n'y a plus de références à un objet, il devient disponible pour la collecte par le garbage collector.

myObject = nullne peut pas le faire; par exemple:

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

Tout ce que cela fait est de définir la référence myObjectà null, cela n'affecte pas l'objet myObjectune fois pointé, sauf pour simplement décrémenter le nombre de références de 1. Puisque myOtherObjectfait toujours référence à cet objet, il n'est pas encore disponible pour être collecté.

Brian Roach
la source
Je devrais donc rendre toutes mes vues de texte et mes boutons d'image nuls dans le onPause?
Ruchir Baronia
8
"La JVM dispose d'un garbage collector qui repose sur le nombre de références." -> c'est une explication très simplifiée. Il vérifie si les objets sont accessibles à partir d'une "racine" spécifique
Johannes
2
La machine virtuelle Java dispose d'un garbage collector qui ne dépend pas spécifiquement du nombre de références. Il repose sur l'accessibilité. S'il s'appuyait sur des comptages de références, il ne pourrait jamais collecter de cycles, et c'est le cas.
Marquis of Lorne
14

Si vous voulez aider un objet à disparaître, définissez sa référence sur null.

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

La définition de la référence à null rendra plus probable que l'objet sera récupéré, tant qu'il n'y a pas d'autres références à l'objet.

John Percival Hackworth
la source
Chaque fois que je fais cela, lorsque mon objet se croise, tout mon jeu se fige et ne supprime pas l'objet.
Stan le
Parce que vous lancez probablement une exception de pointeur null non interceptée. Plus de contexte nous aiderait certainement à vous guider à travers cela.
Joseph Weissman
Je devrais donc rendre toutes mes vues de texte et mes boutons d'image nuls dans le onPause?
Ruchir Baronia
Si vous en avez vraiment besoin pour s'en aller, cela finira par le faire.
John Percival Hackworth
3

Vous n'avez pas besoin de supprimer des objets en java. Lorsqu'il n'y a pas de référence à un objet, il sera collecté automatiquement par le garbage collector.

fmucar
la source
Je devrais donc rendre toutes mes vues de texte et mes boutons d'image nuls dans le onPause?
Ruchir Baronia
0

Vous pouvez supprimer la référence à l'aide de null.

Disons que vous avez la classe A:

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

la dernière instruction supprimera la référence de l'objet aet cet objet sera "garbage collecté" par JVM. C'est l'un des moyens les plus simples d'y parvenir.

Lakhan
la source
Je devrais donc rendre toutes mes vues de texte et mes boutons d'image nuls dans le onPause?
Ruchir Baronia
-3

Oui, java est Garbage collecté, il supprimera la mémoire pour vous.

Jake Kalstad
la source
37
dans le moment le moins attendu
matcheek
2
s / delete / leak / g
Mark K Cowan
-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);
}
}
user3124852
la source
La raison pour laquelle cette réponse est incorrecte est qu'elle supprime uniquement une référence à l'objet, et non l'objet lui-même.
Ben Morris
La raison pour laquelle cette réponse est incorrecte, car elle montre comment vous pouvez supprimer un objet d'une liste - ce n'était pas la question.
phil