IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[débutant]Question théorique sur les objets et leurs références


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Points : 35
    Points
    35
    Par défaut [Résolu][débutant]Question théorique sur les objets et leurs références
    Bien le bonjour!
    Je suis ému, c'est mon premier post!

    Venons-en au fait, une immense question me taraude actuellement, et je ne trouve pas de réponse dans mon ouvrage de référence... (il s'agit de "Thinking in Java", excellent bouquin au demeurant)

    Supposons que j'instancie une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String monString = new String "Blabla";
    Puis, je crée une autre référence vers cet objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String monAutreString = monString
    Les deux "choses" que j'ai crée sont des références vers l'objet en lui-même. Maintenant, j'opère une transformation radicale dans mon objet : par exemple, j'ajoute dix mille caractères à mon String
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<10000;i++){
    monString = monString + "a";
    }
    Là, j'ai un objet qui est très gros il est donc (sans doute) détruit et recrée à un autre endroit de l'espace mémoire, qui contient suffisament de place. (Peut-être que l'exemple du dessus n'est pas pertinent, mais il me semble possible de faire "grossir" la place qu'occupe un objet dans la mémoire, non?) (Je dis ça, parce que je pense qu'un String est une "LinkedList" : chaque caractère pointe vers le suivant, donc, mon exemple ne marche pas, l'objet n'est pas détruit puis recréé)

    Je m'égare : une fois que mon objet est devenu énorme et est "délocalisé" dans un autre endroit de la mémoire, comment diable est-ce que mes références sont "averties" de ce changement? Est-ce qu'elle sont averties au moins? Parce que rien dans l'objet n'indique qu'il existe une référence qui pointe vers lui, non?

    Pragmatiquement : J'ai un objet qui possède des références un peu partout. Est-ce que ces références pointeront toujours vers le bon objet, malgré tout ce que je peux lui faire subir? Et si oui, pourquoi?

  2. #2
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Citation Envoyé par fezvez Voir le message
    Pragmatiquement : J'ai un objet qui possède des références un peu partout. Est-ce que ces références pointeront toujours vers le bon objet, malgré tout ce que je peux lui faire subir? Et si oui, pourquoi?
    Avec tes String, tu es tombé justement sur un cas spécial. Une string est immuable, son état ne peut pas changer. Ce qui fait que lorsque tu réalise l'opération suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<10000;i++){
    monString = monString + "a";
    }
    Tu créé une nouvelle instance a chaque fois. Mais celle d'origine demeure inchangée. Ce qui fait que monAutreString pointe toujours vers "Blabla".

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut et bienvenue sur les forums


    Il faut prendre deux cas bien distinct : les objets immuables (= non modifiables) et les objets muables.



    Dans ton exemple String est un objet immuable et ne peut donc pas être modifié après sa création. Lorsque tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monString = monString + "a";
    Tu crées un nouvel objet en mémoire, et tu l'affectes à la référence monString (donc tu modifies bien la référence également).

    Du coup tu as deux objets en mémoire et chacune de tes références pointent vers un de ces objets :
    • monString pointe vers la nouvelle chaine "Blablaaaaaaaaaaaaa..."
    • monAutreString pointe vers la chaine originale "Blabla".


    A noter que ta boucle est très consommateur en mémoire, car pour rajouter les 10000 "a" il va créer autant d'objet temporaire


    Les objets immuables sont donc fait pour être partagé dans de multiples référence sans que cela ne pose de problème (elles ne peuvent pas être modifié). En fait la "modification" consiste à créer un nouvel objet et l'affecter à une référence, sans que cela n'impacte les autres références.





    Prenons maintenant l'objet StringBuffer (ou StringBuilder à partir de Java 5.0, son équivalent non thread-safe), qui est en quelque sorte la version modifiable de String.

    Tu aurais donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	StringBuffer monString = new StringBuffer("Blabla");
    	StringBuffer monAutreString = monString;
     
    	for(int i=0; i<10000;i++){
    		monString.append("a");
    	}
    La différence vient de l'absence d'affectation ( = ).
    On utilise une méthode qui modifie la valeur de l'objet courant (append()), et pendant tous le traitement on ne manipule qu'un seul et unique objet qui est modifié.

    Au final on se retrouve donc avec deux références qui pointent vers le même objet.



    Si un objet "muable" est modifié, il n'y a pas de mécanisme du langage pour le "signaler" à toutes les références qui pointent vers lui (sauf bien sur si l'objet met en place un système de listener).


    a++

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Points : 35
    Points
    35
    Par défaut
    Vous cherchez à m'impressionner?

    Merci beaucoup à vous deux pour vos réponses! (très rapides)

    Bon, je m'excuse d'avoir utilisé un si mauvais exemple... mais je comprend très bien ce que vous avez cherché à dire! Quoique ... un dernier petit point reste à éclaircir (si cela ne vous dérange pas, of course!)

    Qu'est ce qui détermine le fait qu'on objet soit muable ou pas?

    ...

    J'ai l'impression que ce n'est pas implémenté dans Java, c'est juste une façon de créer une classe :
    - Tous les objets sont muables ou presque. Si on veut les modifier, on utilise des méthodes internes, et basta!
    - Seuls des objets qui pour être modifiés font appel à un constructeur (c'est le cas du String, même si c'est implicite) sont immuables

    Je me trompe?

    PS : Je développe sous QtJambi, donc, ce n'est pas trop un problème d'utiliser un listener, je voulais juste savoir si je dois rajouter des "signals" un peu partout, j'ai ma réponse en tout cas!

Discussions similaires

  1. [PHP 5.0] question théorique sur les méthodes
    Par mariek dans le forum Langage
    Réponses: 6
    Dernier message: 20/02/2009, 08h41
  2. [VS.net 2005] Question philosophique sur les objets
    Par WriteLN dans le forum Framework .NET
    Réponses: 8
    Dernier message: 23/08/2007, 10h34
  3. [Débutant] Question simple sur les checkbox
    Par Mil17 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/08/2007, 15h05
  4. Question théorique sur les normales
    Par Pedro dans le forum DirectX
    Réponses: 5
    Dernier message: 16/10/2005, 19h24
  5. Réponses: 5
    Dernier message: 24/04/2005, 04h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo