Supprimer un objet en java ?

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Supprimer un objet en java ?

par Rockleader » 22 Avr 2015, 15:12

Bonjour, je me pose une question toujours pour l'implémentation de mon jeu de go.


J'ai mes objets de type chaine...il y a un moment ou une chaine sera donc morte et je devrais la supprimer du jeu...donc pour la supprimer je peux bêtement remettre son contenu à vide; mais du coup ça voudra dire que je garde en mémoire une chaine dont le contenu sera juste vide c'est pas un problème car derrière je peux dire à la classe du plateau de ne pas stocker de chaine vide...mais ça me dérange quand même de garder en mémoire une chaine vide car ça voudrait dire théoriquement que je pourrais toujours utiliser des méthodes qui n'ont plus lieux d'être...

J'ai lu qu'il n'y avait pas de destructeurs en java...du coup je me demande comment je peux faire ça...




Pour résumer si j'ai une classe C avec une méthode parler et une méthode détruire.

Si je fais C.detruire je veux que l'on ne puisse plus faire C.parler derrière sans générer une erreur.

Est ce possible ?

Reste la solution de stocker un boolean pour garder l'état vivant ou mort mais...ça ne me parait vraiment pas propre..
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 22 Avr 2015, 15:22

Bonjour,

En java c'est le grabage collection qui s'occupe de nettoyer la mémoire.

Contraitement en C ou dans d'autres langages, la destruction en mémoire est implicite en java.

Le développeur n'a pas la possibilité de détruire tel ou tel objet.

Concernant ton exemple, c'est à toi de vérifier si C existe. C'est le même problème en langage C.

Code: Tout sélectionner
typedef struct {
    int val;
    char *str;
} s_sample;

int main(void) {
    s_sample *ptr = NULL;

    fprintf(stderr, "%s\n", ptr->str); /* Ici ça plante car tu essayes d'accéder à un champ qui n'existe pas puisque ptr est NULL */

    return (0);
}



Normalement tu es maitre de ton code, rien ne t'empèche de rajouter des checks dans tes méthodes pour vérifier que ta chaine existe bien (avec un bool, ou vérifier si elle est non vide, ...)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 22 Avr 2015, 16:34

C'est juste que je trouvais pas ça très propre de vérifier un truc alors que je pourrais simplement le détruire...mais ok si c'est pas possible tant pis^^


Par contre je comprends pas ton rapport avec le c; en c on avait toujours la possibilité de mettre l'instance d'une structure à null avec un pointeur et on considérait le pointeur null comme un objet qui n'existait pas...si on peut parler d'objet.


Alors que dans la méthode remove si je fais un this=null ça ne marchera pas.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 22 Avr 2015, 17:26

Oui je suis d'accord, je n'ai pas du bien comprendre ton exemple.

Pour résumer si j'ai une classe C avec une méthode parler et une méthode détruire.

Si je fais C.detruire je veux que l'on ne puisse plus faire C.parler derrière sans générer une erreur.


A partir du moment où tu détruis C, c'est complètement normal que si tu appelles C.parler(), cela provoque une erreur, vu que ton objet est "détruit"

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 22 Avr 2015, 18:56

Code: Tout sélectionner
class C{
    void detruire(){
        _destroyed = true
    }
    void parler(){
        if(_destroyed){
            throw "invalid call";
        }
    }
}


on peut aussi construire différemment avec un state pattern (jme rappele plus trop mais l'idée est là..)

Code: Tout sélectionner
//lutilisateur a pas besoin de connaitre cette classe
class StateC{
    void parler(){system.out.println('ok')}   
}
class NullC: extend StateC{
    void parler(){throw 'invalid call'}
}
class C{
    public
    StateC _state;
    void parler(){
        _state.parler();
    }
    void destroy(){
        _state = new NullC;
    }
}



de manière plus large, ton instance est normalement scopée, donc si tu veux interdire l'usage, au lieu de la détruire 'explicitement' et lancer l'erreur à "runtime" tu devrais plutot gérer sa portée.

genre
Code: Tout sélectionner
bordelJava::main()
{
    String s = "toto";
    {
        C c =new C(s)
        c.parler()
    }
    c.parler();//invalid call because c is not declared
}
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 23 Avr 2015, 00:41

L'idée du scope est intéressante, je m'en rappellerais je vais pas pouvoir l'utiliser pour mon histoire de Go mais c'est toujours utile de s'en rappeler je pense.

Je pense que je vais juste passer par un boolean et la chaine en mémoire finira bien par être détruite avec le temps.


En tout cas merci pour vos réponses.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite