Posez votre question Signaler

Java passage par reference

ulquiorra 31Messages postés jeudi 6 septembre 2007Date d'inscription 29 juillet 2009 Dernière intervention - Dernière réponse le 18 févr. 2013 à 00:15
Bonjour,
j'ai une problème au niveau d'une methode que je viens de creer .
Cette methode recoit un argument de type short , elle lui affecte une valeur, mais le problème c que ca valeur ne change pas en dehors de la fonction
dans main () j'appelle la methode : i=0, affect(i); la méthode fait i=1; quand j'affiche la valeur de i c'est toujours 0;
je crois que je devrait passer l'argument par reference ou par adresse mais je ne sais pas comment le faire en java
Lire la suite 
Réponse
+23
moins plus
Bonsoir,
En java, tu ne peux pas choisir de passer tes paramètres par référence ou par valeur.
La règle est la suivante :
- ton paramètre est un objet, alors il est passé par référence
- ton paramètre est un type primitif, alors il est passé par valeur (par copie)

Donc si tu passe un short en paramètre, alors tu ne pourras pas modifier sa valeur initiale (tu vas changer la valeur de la copie, mais ça ne sera pas répercuté sur la variable initiale).
Si tu passes un Short, on peut imaginer modifier sa valeur interne, mais en fait non puisque Short est immutable (et final pour rien améliorer) :(

Donc une solution est de créer un pojo comme le suivant :
public class ShortContainer {
 private short value;
 
 public short getValue() { return this.value; }
 public void setValue(short value) { this.value = value; }
}


Voilà. C'est un peu dommage car au final c'est un peu comme si on utilisait un Short, mais bon ça répond à ton problème.

Cordialement,
Ajouter un commentaire
Réponse
+3
moins plus
J'ai le même probleme avec un objet de type String ou encore avec un objet de type HttpRequest.
J'envois l'objet (enfin en principe la référence à l'objet) à une méthode d'une autre classe en paramètre.
La valeur est modifiée dans la méthode. La valeur ne bouge pas à la sortie de ma méthode...

Voici le code :

public class main {

public static void main(String[] args) {
String test="test";
ValideurTest.test(test);
System.out.println("Résultat : "+test);
}

public class ValideurTest {

public static void test(String s){
s="le test marche";
}

}

A l'exécution :
Résultat : test


Comment faire ?
SeiromeM- 11 mai 2012 à 14:50
J'aimerai bien savoir aussi ...
Répondre
KX 11779Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 2 août 2015 Dernière intervention - 11 mai 2012 à 15:58
On ne peut pas !

En fait la référence 's' est modifiée et correspond après affectation à l'objet String de valeur "le test marche", alors que la référence 'test' n'a pas été modifiée et correspond toujours à l'objet String de valeur "test", ce qu'il faudrait ce n'est donc pas modifier les références mais modifier les objets, en faisant appel à des méthodes de modification. Or les objets String sont immuables, c'est à dire qu'aucune méthode de la classe String ne va modifier l'objet, elles vont systématiquement créer de nouveaux objets qui auront donc des références différentes et ça reviendra au même..?

Ce que l'on peut faire, c'est passer par un StringBuilder dont on pourra modifier la valeur sans changer aux références. Exemple :

public class Main
{
	public static void main(String...args) 
	{
		StringBuilder test = new StringBuilder("test");
		
		ValideurTest.test(test);
		
		System.out.println("Résultat : "+test);
	}
}

public class ValideurTest
{
	public static void test(StringBuilder s)
	{ 
		s.replace(0, s.length(), "le test marche");	
	}
}
Répondre
zibox2- 15 mai 2012 à 19:33
Avec un StringBuffer à la place du String ça marche !
Dommage que la classe String n'ait pas une "affect()" par défaut...

Merci pour vos réponses !

++
Répondre
DukeAstar- 18 févr. 2013 à 00:15
la class String est immutable c est pour cela que la valeur ne peut changer
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
glabal i pour que i prenne sa valeur dans tout ton code :)
ulquiorra 31Messages postés jeudi 6 septembre 2007Date d'inscription 29 juillet 2009 Dernière intervention - 21 juil. 2009 à 14:54
Désolé mais je ne veux pas faire ca

y aura il une autre solution ?
Répondre
Djidane- 9 oct. 2009 à 13:22
Simplement en faisant

i = affect(i);

Bien à toi,
Djidane
Répondre
Ajouter un commentaire
Ce document intitulé «  java passage par reference  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.