120 votes

Suppression d'un objet en java ?

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

delete follower1;

n'a pas fonctionné.

EDIT :

Ok, je vais donner un peu plus de contexte. Je suis en train de créer 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 une 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;
    }
}

1 votes

pouvez-vous fournir un peu plus de contexte ?

2 votes

Il n'y a pas de suppression d'objets en Java. Mais vous n'avez normalement pas besoin de le faire : ce dont vous avez besoin, c'est de vous assurer que plus rien n'est affiché à l'écran (si c'est ce que fait "vous suivre").

0 votes

Peut-être voulez-vous essayer de forcer le ramasseur de déchets à supprimer un objet ? Il existe une question à ce sujet. ici déjà. Ou peut-être essayez-vous quelque chose d'autre ? Vous pouvez essayer de lire un peu sur le ramasseur de déchets. ici ou ici Si cela ne vous aide toujours pas, vous devrez être plus précis.

212voto

MByD Points 78505

Vous devez supprimer ses références en lui assignant null ou en quittant le bloc où il a été déclaré. Après cela, il sera automatiquement supprimé par le ramasseur d'ordures (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.

Ce n'est pas quelque chose que vous recherchez actuellement, mais pour info : vous pouvez invoquer le ramasseur de déchets avec l'appel System.gc()

30 votes

Devoir appeler manuellement System.gc() est généralement pas une bonne idée car elle peut être ignorée par la JVM.

3 votes

Ce n'est pas une bonne idée, mais vous pouvez aussi faire un appel similaire à System.. Runtime.getRuntime().gc(). Plus d'informations : les routines de collecte des déchets fournies par Java sont des membres de la classe Runtime. La classe Runtime est une classe spéciale qui possède un seul objet (un Singleton) pour chaque programme principal. L'objet Runtime fournit un mécanisme permettant de communiquer directement avec la machine virtuelle. Pour obtenir l'instance Runtime, vous pouvez utiliser la méthode Runtime.getRuntime(), qui renvoie le Singleton.

1 votes

Est null l'affectation d'un signe précis au GC que cet objet doit être Garbaged Cleaned lors de la prochaine invocation du GC ? null aux objets de collection (Listes, Arrays) les marque pour le nettoyage ? stackoverflow.com/questions/449409/

83voto

Brian Roach Points 43787

Votre C++ se manifeste.

Il n'y a pas delete en java, et tous les objets sont créés sur le tas. La JVM dispose d'un ramasseur de déchets qui s'appuie sur le nombre de références.

Une fois qu'il n'y a plus de références à un objet, celui-ci devient disponible pour être collecté par le ramasseur d'ordures.

myObject = null peut ne 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 mettre la référence myObject à null, cela n'affecte pas l'objet myObject une fois qu'elle a été pointée, sauf pour décrémenter simplement le nombre de références de 1. myOtherObject fait toujours référence à cet objet, il n'est pas encore disponible pour être collecté.

0 votes

Je devrais donc rendre tous mes textviews et boutons d'image nuls dans le fichier onPause ?

11 votes

"La JVM a un ramasseur de déchets qui se base 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.

5 votes

La JVM a un ramasseur de déchets qui fait spécifiquement pas s'appuie sur le nombre de références. Il s'appuie sur l'accessibilité. S'il s'appuyait sur le comptage des références, il ne pourrait jamais collecter de cycles, et il le fait.

15voto

Si vous voulez faire disparaître un objet, mettez sa référence à null.

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

En mettant la référence à null, l'objet aura plus de chances d'être récupéré par les ordures ménagères, tant qu'il n'y a pas d'autres références à cet objet.

0 votes

Chaque fois que je fais cela, lorsque mon objet se croise, tout le jeu se fige et l'objet n'est pas supprimé.

1 votes

Parce que vous êtes probablement en train de lancer une exception de pointeur nul. Plus de contexte nous aiderait certainement à vous guider dans cette situation.

0 votes

Je devrais donc rendre tous mes textviews et boutons d'image nuls dans le fichier onPause ?

3voto

Fawix Points 311

Peut-être voulez-vous essayer de forcer le ramasseur de déchets à supprimer un objet ? Il existe une question à ce sujet. ici déjà.

Ou peut-être essayez-vous autre chose ? Vous pouvez essayer de lire un peu sur le garbage collector ici ou ici

Si cela ne vous aide toujours pas, vous devrez être plus précis.

3voto

fmucar Points 6937

Il n'est pas nécessaire de supprimer des objets en java. Lorsqu'il n'y a plus de référence à un objet, celui-ci est automatiquement récupéré par le ramasseur d'ordures.

0 votes

Je devrais donc rendre tous mes textviews et boutons d'image nuls dans le fichier onPause ?

0 votes

@RuchirBaronia Non. Ils sont toujours référencés par votre AppCompatActivity, mais si l'AppCompatActivity n'est plus référencée, ils seront supprimés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X