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 :

Equivalent pointeurs en Java?


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut Equivalent pointeurs en Java?
    Bonjour,

    j'essaye de modifier un object externe via une méthode d'un autre object, mais j'ai du mal à comprendre.

    Supposons mon application: un stock exchange miniature. L'objet principal est StockExchange qui contient des listes de stocks, des banques, des clients et des clients virtuels, des méthodes,...

    D'un autre côté, j'ai un objet ClientVirtuel (sous-classe de Client) qui tournera tout seul grâce aux threads et à une intelligence artificielle. Cet objet doit savoir quels sont les stocks disponibles afin d'en acheter et d'en vendre.

    Comment puis-je modifier le contenu de StockExchange à partir du ClientVirtuel? Le constructeur actuel est public ClientVirtuel(String name){}. Je ne dois pas faire passer l'objet StockExchange en paramètre aussi?

    Si je le fais, ça créera un nouveau StockExchange avec les valeurs initiales du premier mais au moindre changement futur, il faudra le mettre-à-jour dans un sens comme dans l'autre.

    Ce que j'aimerai faire, c'est arriver à mettre aux courant des disponibilités des stocks tout en gardant la liste des stocks à jour.

    En C, j'aurai utilisé un pointeur pour m'assurer que ce soit le même élément partout.

    Comment pourrais-je faire fonctionner cela efficacement?

    Merci par avance.

  2. #2
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Slt
    En java lorsque tu passe un objet en parametre il n'est pas recopié, sa référence est tout simplement passé (sauf types primitifs). C'est pour cela qu'a part certain objets speciaux (String -> immutable), ils SONT TOUS modifiables de maniere externe. C'est justement pour empecher cela que l'on déclare les champs private et pas de getters, ou que certaines methodes permettent de garantir la non modification (COllections.unmodifiableList())

  3. #3
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Ok mais comment puis-je faire cela alors concrètement?

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class VirtualClient extends Client implements Runnable{
        boolean clientLife;
        StockExchange SE;
     
        public VirtualClient() {
        }
     
        public VirtualClient(String cName, StockExchange se) {
        	this.clientIP = null;
    	this.clientName = cName;
            this.clientSold = 1000;
            this.bankIP = null;
            this.bankPort = -1;
    	this.clientStockList = new ArrayList();
    	this.clientLife  = true;
    	this.SE = se;
        }
     
        public void run() {
    	/*
    	 * 0, 4, 5, 6 = nothing
    	 * 1 = buy
    	 * 2 = sell
    	 * 3 = exit
    	 */
    	int action;
     
    	while (clientLife){
    	    action = (int) (Math.random()*7);
     
    	    switch (action){
    		case 1:
    		    System.out.println(this.getClientName()+" buy");
    		    break;
    		case 2:
    		    if (this.getNumberOfStocks() == 0){
    			System.out.println(this.getClientName()+" can't sell (0 stocks)");
    			break;
    		    }
    		    else{
    			System.out.println(this.getClientName()+" sell");
    			break;
    		    }
    		case 3:
    		    clientLife=false;
    		    System.out.println(this.getClientName()+" exit the stock exchange");
    		    break;
    		default: 
    		    System.out.println(this.getClientName()+" do nothing");
    		    break;
    	    }
     
    	    try {
    		Thread.sleep(15000);
    	    } catch (Exception e) {
    		System.err.println("Error :"+e.getMessage());
    	    }
    	}
    	Thread.interrupted();
        }
     
    }

    Voici le contenu de ClientVirtuel, je récupère grâce au constructeur le contenu du StockExchange, mais c'est seulement dans la méthode run que je vais avoir besoin de lire/modifier StockExchange. Je suppose que je ne dois pas déclarer un nouveau StockExchange, mais je ne sais pas accéder à son contenu autrement?

    PS:
    -Les Threads sont lancées au moment de la création des ClientVirtuels
    -J'ai fait une méthode getStockExchange qui retourne un StockExchange, mais je ne vois pas comment l'utiliser/l'appeler dans ClientVirtuel.

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Tu parlais de pointeurs, et bien dis-toi que lorsque tu passe l'objet en paramètre dans ton constructeur, C'EST UN POINTEUR.
    Pour faire une correlation C/Java, dis-toi que tout les objets que tu développe (les classes), lorsqu'elles sont passée en paramètre, se font par référence, en gros c'est un pointeur que tu passes. La seule différence avec C est qu'il n'y a pas de caractère '&' ou '*'.

  5. #5
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Donc, si je comprends bien ce que tu veux dire, il suffit que je fasse passer le StockExchange dans le paramètre du constructeur pour que je puisse l'utiliser dans la méthode run() ? Je ne suis pas obligé de faire this.SE= se (ce qui aurait pour conséquence de créer un nouveau StockExchange complètement indépendant) ?

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par v4np13 Voir le message
    Je ne suis pas obligé de faire this.SE= se (ce qui aurait pour conséquence de créer un nouveau StockExchange complètement indépendant) ?
    Non cela ne crée pas un nouvel objet complètement indépendant, mais cela se contente de copier la référence : il n'y a pas de constructeur de copie en Java !
    Donc tu copies la référence dans un attribut de l'objet afin de pouvoir la réutiliser...

    this.SE et se pointent tous les deux vers le même objet : c'est comme si tu avais fais une copie de la valeur d'un pointeur.

    Ton problème va plutôt se situer au niveau de la gestion thread-safe de ta classe, puisque tu semble la manipulé depuis plusieurs thread...

    Il y a principalement deux différences entre les pointeurs du C/C++ et les références de Java :
    • Les références ne peuvent pas pointer vers un espace mémoire incorrect (soit elles sont valides, soit elles sont nulles).
    • Il n'y a pas d'arithmétique sur les pointeurs.


    a++

  7. #7
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Un grand merci pour vos explications, il a fallu le temps, mais ça à fait tilt. Et maintenant, mon programme fonctionne à merveille.

  8. #8
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    Bonjour,
    cette discussion est classée 2ème sur google pour << java pointeur >>.

    En gros, si on oublie le garbage collector (ce que l'on est censé faire la plupart du temps : supposer que java fera les delete aux bons/meilleurs endroits), pour passer de Java à C++ il y a la correspondance suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Java 
    Maclasse a;
     
    // C++
    Maclasse *a;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Java
    Maclasse b = new Maclasse;
     
    // C++
    Maclasse *b = new Maclasse;
    et remplacer l'opérateur '.' de Java par l'opérateur '->' de C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Java
    a.champ = "chaine";
     
     
    // C++
    a->champ = "chaine";
    Les tableaux java ne sont pas foncièrement différents des tableaux C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Java
    int[] tab = {1,2,3}; 
    int[] tab2 = {3,4,5,6}; 
    tab = tab2;
     
    // C++
    int* tab = {1,2,3};
    int* tab2 = {3,4,5,6};
    tab = tab2;
    En gros, en java tous les objets ne peuvent être manipulés que via un pointeur.

    Pour avoir un pointeur vers 'int' il suffit de faire un tableau de int ou bien de faire une classe avec juste un 'int' comme champ.
    Et pour avoir un pointeur de pointeur sur objet il faut soit mettre un objet (donc un pointeur vers objet) dans un tableau, soit dans une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    // C++
    Maclasse a;
    Maclasse *ptra = &a;
    Maclasse **pptra = &ptra;
     
    // Java
    Maclasse ptra = new Maclasse;
    Maclasse[] pptra = {ptra};
     
    // ou bien un équivalent :
    public class PMaclasse
    {
        Maclasse ptra;   // ptra est un pointeur
        PMclasse(Maclasse ptra) { ptra = _ptra }
        Maclasse Get() { return ptra; }
        void Set(Maclasse _ptra) { ptra = _ptra; }
    }
     
     
    Maclasse ptr = null; // ptra est un pointeur vers 'struct Maclasse'
    PMaclasse pptr(ptra); // pptra est un pointeur vers pointeur vers 'struct Maclasse'

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par acx01b Voir le message
    Pour avoir un pointeur vers 'int' il suffit de faire un tableau de int ou bien de faire une classe avec juste un 'int' comme champ.
    Et pour avoir un pointeur de pointeur sur objet il faut soit mettre un objet (donc un pointeur vers objet) dans un tableau, soit dans une classe :
    Nous noterons qu'en général on évitera cela.

    Un "pointeur vers pointeur" ou un "pointeur vers int," en Java ça ne sert qu'à pouvoir modifier un int ou changer un objet, qu'on garde quelque part en mémoire.
    Pour faire cela il vaut mieux définir une fois pour toutes, une classe qui contient tout l'état qu'on veut garder, et y mettre, les ints, les objets, tout ce qu'on voulait garder en mémoire dans un coin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/08/2009, 14h31
  2. Equivalent de Jfreechart [Java] en VB.net
    Par guandal dans le forum VB.NET
    Réponses: 2
    Dernier message: 31/01/2007, 11h47
  3. Equivalent de ByteBuffer (Java) en C#
    Par vandamme dans le forum C#
    Réponses: 2
    Dernier message: 23/01/2007, 22h34
  4. [Info]equivalent chdir en java
    Par man4surfs dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 18/07/2005, 10h41
  5. [C#] Equivalence des API java en C# en ligne
    Par totoranky dans le forum Windows Forms
    Réponses: 6
    Dernier message: 15/02/2005, 02h16

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