Passage variable par référence

Résolu
Utilisateur anonyme - 11 avril 2009 à 22:28
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 12 avril 2009 à 20:42
Bonjour, voici une question que je n'ai jamais eu à me poser et qui pourtant paraît très bête : le passage d'une variable, un int par exemple, par référence et non par valeur.

Si on veut modifier la valeur d'un entier grâce à une méthode, on peut faire un return bien sûr, mais si il y a plusieurs entiers, ... cela reste trop limité.
De plus si on veut qu'une variable est sa valeur toujours attachée à celle d'une autre variable, cela ne marche plus.
Je n'ai quasiment pas fait de C, mais en C avec un pointeur c'est immédiat. Alors en java, faut-il créer une classe exprès pour gérer ce cas, pour faire un passage par référence d'une classe contenant cet entier, ou peut-on simplement associé la valeur d'un entier à un autre.

Je donne un exemple (c'est pas du java, c'est juste pour comprendre) :
x=0
y=x // donc y = 0
x=2
//alors y=2 aussi
C'est ce que j'aimerai obtenir.

Voici un exemple que j'ai fait avec une classe pour palier le problème, mais est-on obligé de passer par une classe juste pour ça ?

public class Test3 {
    public static void main(String[] args) {
    Enveloppeur wrapper1 = new Enveloppeur(5);
    Enveloppeur wrapper2 = new Enveloppeur();
    System.out.println(wrapper1.getI());
    System.out.println(wrapper2.getI());
   
    Origin o = wrapper1.getO();
    wrapper2.setO(o);
    o=null;

    System.out.println(wrapper1.getI());
    System.out.println(wrapper2.getI());
   
    wrapper1.setI(6);
   
    System.out.println(wrapper1.getI());
    System.out.println(wrapper2.getI());
 }
}
class Enveloppeur {
private Origin o;
Enveloppeur(){
o = new Origin();   
}
Enveloppeur(int i){
    o = new Origin(i);   
}
public void setI(int i) {
    o.setOrigin(i);
}
public int getI() {
    return o.getOrigin();
}
public Origin getO() {
   
    return o;
}
public void setO(Origin o) {
    this.o=o;
}
}
   

class Origin { //wrapper
private int i;
Origin(){
    }
   
Origin(int i){
    setOrigin(i);
}
void setOrigin(int i){
    this.i=i;
}
int getOrigin(){
    return i;
}
}

Merci d'avance
++ et bonne prog

PS : enfin dernière question, avec le système que j'emploie, à cette ligne ci :

    Origin o = wrapper1.getO();

    wrapper2.setO(o);

    o=null;

Pourquoi si je la remplace par cela, ça ne marche plus : wrapper2.getO()=wrapper1.getO();

Je récupère l'instance o de wrapper2 que je fais pointer sur le même objet (Origin) que l'instance o de wrapper1 ??? non ?

Mais j'ai une erreur : the left-hand side of an assignment msut be a variable. (sous eclipse)

1 réponse

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 avril 2009 à 20:42
Dans Java, une classe telle que Integer agit en tant qu'emballage simple autour de ses contre-parties primitives -- dans ce cas-ci, int. Les emballages trouvés dans java.lang nous permettent de traiter les primitifs comme si ils étaient des objets. Ainsi, par exemple, vous ne pourriez pas mettre un int dans un vecteur sans l'envelopper avec un objet Integer d'abord. Les classes immuables offrent un certain nombre d'avantages. D'abord, une méthode ne peut pas changer un objet immuable d'une manière inattendue. Puisqu'une méthode ne peut pas laisser l'objet dans un certain état inattendu, vous évitez un certain nombre de bogues. En second lieu, un objet immuable est intrinsèquement "thread save". Puisqu'un "thread" ne peut pas changer l'objet, vous n'avez pas besoin de protéger l'objet contre l'accès concourant de "thread". Naturellement, si vous devez modifier vos instances d'Integer vous êtes hors de la chance. Vous pouvez écrire votre propre classe mutable d'emballage de nombre entier à l'usage de vos propres objets. Cependant, vous ne pouvez faire rien au sujet des tiers objets qui retournent des instance de java.lang.Integer.
3
Rejoignez-nous