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 :

arguments inout ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut arguments inout ?
    Bonjour,
    Je n'ai pas une grande expérience de JAVA, comme va le montrer ma question de newbie : Je souhaite faire une méthode qui prend en arguments un certain nombre de trucs, et les modifie. Evidemment je souhaite que mes modifications persistent quand je sort de ma méthode.
    En C++ j'aurais passé ces arguments en référrence avec le "&". Je constate que le "&" n'existe pas en java, ni les "inout" du style ada.

    Les arguments sont ils inout par défaut ? (après un petit test, ca semble être le cas pour un objet d'une classe que j'ai défini, mais pas pour un simple int par exemple)

    Quelle est la manière propre de faire ?

  2. #2
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Tu peux construire un objet spécifique qui contient comme attributs tout ce que tu veux modifier. Tu peux faire des méthodes get/set pour ces attributs afin de pouvoir y accéder et les modifier.

    Mais en général, cela dépend de ce que tu veux concevoir. En tout cas, si tu veux modifier un paramètre d'une méthode, tu peux le faire uniquement si c'est un objet. Tu ne peux ainsi pas modifier la référence passée en paramètre d'une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void truc(Object obj){
    ...
    obj = new Object(); // Interdit !!!
    ...
    }
    Mais tu peux tout à fait modifier l'OBJET pointé par cette référence.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    oui mais par exemple, dans un cas du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MaMethode(int MonInt, Bidule MonBidule)
    {
    ...
    MonInt ++;
    MonBidule.Intattribut++;
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String args[]){
    ...
    int I=0;
    Bidule MonBidule = new Bidule();
    MaMethode(I,MonBidule);
    ...
    // MonBidule a bien été modifié sans que je ne spécifie explicitement
    // que je le passait à MaMethode par référrence plutot que par copie
     
    // I n'a pas été modifié ! Lui est passé par copie et non par référrence !
    }
    Alors "tout" est passé par référrence, mais pas le int par exemple. Quels sont les autres choses qui ne sont pas passées automatiquement par référrence ? Peut on forcer ces choses à être passées par référrence ?

  4. #4
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    les types primitifs sont passés par valeur et les objets par reference, c'est aussi simple que cela. Si tu souhaite que tes types primitifs soient modifiés, encapsule les dans un objet (classes Integer, Double, Float et autres) : depuis la version 1.5 de java tu dispose de l'autoboxing qui te permettra d'eviter certaines lourdeur d'ecriture

  5. #5
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par leyee
    les types primitifs sont passés par valeur et les objets par reference, c'est aussi simple que cela
    En fait, ce n'est pas tout à fait le cas mais bon, pour simplifier, on peut (presque) voir la chose comme ça.

    Citation Envoyé par leyee
    Si tu souhaite que tes types primitifs soient modifiés, encapsule les dans un objet (classes Integer, Double, Float et autres) : depuis la version 1.5 de java tu dispose de l'autoboxing qui te permettra d'eviter certaines lourdeur d'ecriture
    Ca par contre, c'est faux, tu ne peux pas utiliser les classes wrappers prédéfinies dans Java pour faire ça, car celles-ci sont inaltérables (cad qu'une fois une instance d'une de ces classes créée, on ne peux plus en modifier la valeur autrement qu'en lui affectant une nouvelle référence (donc à créer un nouvelle instance de cette classe), il n'y a pas de méthode setXXX).

    Pour que des types primitifs puissent être effectivement être modifiés par l'appel d'une méthode, il faut effectivement les encapsuler mais surtout pas dans un objet Wrapper prédéfini dans Java. Il faut créer un objet perso où tu as une variable d'instance du type que tu veux et définir une méthode d'altération afin de pouvoir en modifier la valeur dans une méthode quelconque. Cet objet constituera également un wrapper, mais sera altérable.

    Dit avec du code ça donne ça :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    //un classe enveloppe qui va permettre de pouvoir modifier une variable int dans une méthode quelconque
    public class MyIntWrapper{
     
     
    	private int myValue;
     
    	public MyInt(int myValue){
    		this.myValue = myValue;
    	}
     
    	public int getMyValue(){
    		return myValue;
    	}
     
    	public void setMyValue(int myValue){
    		this.myValue = myValue;
    	}
     
    }
     
    //Pour déclarer une instance de cette classe on ferait :
    	MyIntWrapper wrapper = new MyIntWrapper(5);
     
    //maintenant exemple d'une méthode d'une classe quelconque modifiant la valeur d'un objet MyIntWrapper
     
     
    public 	MyOtherClass{
     
    	public static void addOne(MyIntWrapper wrapper){
    		wrapper.setMyValue(getMyValue()+1)
    	}
    }
     
    //exemple d'utilisation
    	MyIntWrapper wrapper = new MyIntWrapper(5);
    	MyOtherClass.addOne(wrapper);
    	System.out.println(wrapper.getValue); //renvoie 6
    En espérant être clair...

  6. #6
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Merci pour la precision : j'ai eu un doute lorsque j'ai ecrit et j'ai testé et effectivement il faut non pas utiliser les classes Integer et cie qui sont immuables mais des objets faits maison

Discussions similaires

  1. Arguments pour et contre Access ?
    Par bottura dans le forum Sondages et Débats
    Réponses: 240
    Dernier message: 23/03/2018, 23h25
  2. [MySQL] PHP.PDO Appel d’une procédure stockée MYSQL avec arguments IN, OUT et INOUT
    Par Depite dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/03/2015, 10h20
  3. Réponses: 3
    Dernier message: 23/10/2008, 19h42
  4. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

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