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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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++

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/08/2009, 13h31
  2. Equivalent de Jfreechart [Java] en VB.net
    Par guandal dans le forum VB.NET
    Réponses: 2
    Dernier message: 31/01/2007, 10h47
  3. Equivalent de ByteBuffer (Java) en C#
    Par vandamme dans le forum C#
    Réponses: 2
    Dernier message: 23/01/2007, 21h34
  4. [Info]equivalent chdir en java
    Par man4surfs dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 18/07/2005, 09h41
  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, 01h16

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