Comment utiliser un paramètre de sortie en Java?

Quelqu’un pourrait-il s’il vous plaît me donner un exemple de code qui utilise un paramètre de sortie dans la fonction? J’ai essayé de le chercher sur Google mais je l’ai juste trouvé dans les fonctions. Je voudrais utiliser cette valeur de sortie dans une autre fonction.

Le code que je développe est destiné à être exécuté sous Android.

Java passe par valeur; il n’y a pas out paramètre comme en C #.

Vous pouvez soit utiliser return , soit modifier un object passé en tant que référence ( par valeur).

Questions connexes

  • Est-ce que Java a quelque chose comme les mots-clés de ref et out de C #? ? (NON!)
  • Java passe-t-il par référence? (NON!)

Échantillon de code

 public class FunctionSample { static Ssortingng fReturn() { return "Hello!"; } static void fArgNoWorkie(Ssortingng s) { s = "What am I doing???"; // Doesn't "work"! Java passes by value! } static void fMutate(SsortingngBuilder sb) { sb.append("Here you go!"); } public static void main(Ssortingng[] args) { Ssortingng s = null; s = fReturn(); System.out.println(s); // prints "Hello!" fArgNoWorkie(s); System.out.println(s); // prints "Hello!" SsortingngBuilder sb = new SsortingngBuilder(); fMutate(sb); s = sb.toSsortingng(); System.out.println(s); // prints "Here you go!" } } 

Voir également

  • Qu’entend-on par immuable?
  • SsortingngBuilder et SsortingngBuffer en Java

En ce qui concerne le code avec lequel OP a besoin d’aide, voici une solution typique d’utilisation d’une valeur spéciale (généralement null pour les types de référence) pour indiquer le succès / l’échec:

Au lieu de:

 Ssortingng oPerson= null; if (CheckAddress("5556", oPerson)) { print(oPerson); // DOESN'T "WORK"! Java passes by value; Ssortingng is immutable! } private boolean CheckAddress(Ssortingng iAddress, Ssortingng oPerson) { // on search succeeded: oPerson = something; // DOESN'T "WORK"! return true; : // on search failed: return false; } 

Utilisez plutôt un type de retour Ssortingng avec la valeur null pour indiquer un échec.

 Ssortingng person = checkAddress("5556"); if (person != null) { print(person); } private Ssortingng checkAddress(Ssortingng address) { // on search succeeded: return something; : // on search failed: return null; } 

Voici comment java.io.BufferedReader.readLine() fonctionne, par exemple: il retourne instanceof Ssortingng (peut-être une chaîne vide!), Jusqu’à ce qu’il renvoie null pour indiquer la fin de la “recherche”.

Bien entendu, cela ne se limite pas à une valeur de retour de type référence. La clé est qu’il doit y avoir des valeurs spéciales qui ne sont jamais une valeur valide et que vous utilisez cette valeur à des fins spéciales.

Un autre exemple classique est Ssortingng.indexOf : il renvoie -1 pour indiquer un échec de recherche.

Note : comme Java n’a pas de concept de parameters “input” et “output”, l’utilisation du préfixe i- et o- (par exemple, iAddress , oPerson ) est inutile et non unidiomatic.


Une solution plus générale

Si vous devez renvoyer plusieurs valeurs, elles sont généralement liées (par exemple, les coordonnées x et y d’un seul Point ). La meilleure solution serait d’encapsuler ces valeurs ensemble. Les gens ont utilisé un Object[] ou une List , ou une Pair générique Pair , mais en réalité, votre propre type serait le meilleur.

Pour ce problème, je recommande un type immuable SearchResult comme celui-ci pour encapsuler les résultats de recherche boolean et de Ssortingng :

 public class SearchResult { public final Ssortingng name; public final boolean isFound; public SearchResult(Ssortingng name, boolean isFound) { this.name = name; this.isFound = isFound; } } 

Ensuite, dans votre fonction de recherche, vous effectuez les opérations suivantes:

 private SearchResult checkAddress(Ssortingng address) { // on address search succeed return new SearchResult(foundName, true); : // on address search failed return new SearchResult(null, false); } 

Et puis vous l’utilisez comme ceci:

 SearchResult sr = checkAddress("5556"); if (sr.isFound) { Ssortingng name = sr.name; //... } 

Si vous le souhaitez, vous pouvez (et probablement devriez) rendre les final champs immuables non public , et utiliser plutôt les getters public .

Java ne prend pas en charge les parameters de sortie. Vous pouvez utiliser une valeur de retour ou transmettre un object en tant que paramètre et modifier l’object.

Pour contourner ce problème, un “ObjectHolder” générique peut être utilisé. Voir l’exemple de code ci-dessous.

La sortie de l’échantillon est:

 name: John Doe dob:1953-12-17 name: Jim Miller dob:1947-04-18 

donc le paramètre Person a été modifié car il est enveloppé dans le Holder qui est passé par valeur – le paramètre générique à l’intérieur est une référence où le contenu peut être modifié – donc une personne différente est renvoyée et l’original rest tel quel.

 /** * show work around for missing call by reference in java */ public class OutparamTest { /** * a test class to be used as parameter */ public static class Person { public Ssortingng name; public Ssortingng dob; public void show() { System.out.println("name: "+name+"\ndob:"+dob); } } /** * ObjectHolder (Generic ParameterWrapper) */ public static class ObjectHolder { public ObjectHolder(T param) { this.param=param; } public T param; } /** * ObjectHolder is substitute for missing "out" parameter */ public static void setPersonData(ObjectHolder personHolder,Ssortingng name,Ssortingng dob) { // Holder needs to be dereferenced to get access to content personHolder.param=new Person(); personHolder.param.name=name; personHolder.param.dob=dob; } /** * show how it works */ public static void main(Ssortingng args[]) { Person jim=new Person(); jim.name="Jim Miller"; jim.dob="1947-04-18"; ObjectHolder testPersonHolder=new ObjectHolder(jim); // modify the testPersonHolder person content by actually creating and returning // a new Person in the "out parameter" setPersonData(testPersonHolder,"John Doe","1953-12-17"); testPersonHolder.param.show(); jim.show(); } } 

Vous pouvez soit utiliser:

  • retourne X. Cela ne renverra qu’une valeur.

  • retourne l’object. va retourner un object complet. Par exemple, votre object peut inclure des valeurs X, Y et Z.

  • passer le tableau. les tableaux sont passés par référence. Par exemple, si vous passez un tableau d’entiers, modifiez le tableau à l’intérieur de la méthode, le code d’origine verra les modifications.

Exemple sur passer Array.

 void methodOne{ int [] arr = {1,2,3}; methodTwo(arr); ...//print arr here } void methodTwo(int [] arr){ for (int i=0; i 

Cela va imprimer: 4,5,6.

Enveloppez la valeur passée dans différentes classes qui pourraient être utiles pour faire le tour, vérifiez ci-dessous pour plus d’exemples réels:

  class Ref{ T s; public void set(T value){ s = value; } public T get(){ return s; } public Ref(T value) { s = value; } } class Out{ T s; public void set(T value){ s = value; } public T get(){ return s; } public Out() { } } public static void doAndChangeRefs (Ref str, Ref i, Out str2){ //refs passed .. set value str.set("def"); i.set(10); //out param passed as null .. instantiate and set str2 = new Out(); str2.set("hello world"); } public static void main(Ssortingng args[]) { Ref iRef = new Ref(11); Out strOut = null; doAndChangeRefs(new Ref("test"), iRef, strOut); System.out.println(iRef.get()); System.out.println(strOut.get()); } 

Ce n’est pas exact —> “… * tableau pass. Les tableaux sont passés par référence. Par exemple, si vous passez un tableau d’entiers, modifiez le tableau à l’intérieur de la méthode.

Chaque type de paramètre est transmis par valeur en Java. Les tableaux sont object, sa référence à l’object est passée par valeur.

Cela inclut un tableau de primitives (int, double, ..) et des objects. La valeur entière est modifiée par la méthodeTwo () mais il s’agit toujours de la même référence d’object, la méthodeTwo () ne peut pas append d’élément de tableau ou supprimer un élément de tableau. methodTwo () ne peut pas également créer un nouveau tableau, puis définir ce nouveau tableau sur arr. Si vous pouvez vraiment passer un tableau par référence, vous pouvez remplacer ce dernier par un nouveau tableau d’entiers.

Chaque object passé en paramètre dans Java est transmis par valeur, sans exception.

Je vous remercie. J’utilise le passage dans un object en tant que paramètre. Mon code Android est ci-dessous

  Ssortingng oPerson= null; if (CheckAddress("5556", oPerson)) { Toast.makeText(this, "It's Match! " + oPerson, Toast.LENGTH_LONG).show(); } private boolean CheckAddress(Ssortingng iAddress, Ssortingng oPerson) { Cursor cAddress = mDbHelper.getAllContacts(); Ssortingng address = ""; if (cAddress.getCount() > 0) { cAddress.moveToFirst(); while (cAddress.isAfterLast() == false) { address = cAddress.getSsortingng(2).toSsortingng(); oPerson = cAddress.getSsortingng(1).toSsortingng(); if(iAddress.indexOf(address) != -1) { Toast.makeText(this, "Person : " + oPerson, Toast.LENGTH_LONG).show(); System.out.println(oPerson); cAddress.close(); return true; } else cAddress.moveToNext(); } } cAddress.close(); return false; } 

Le résultat est

Personne: John

C’est du match! nul

En fait, “c’est match! John”

S’il vous plaît vérifier mon erreur.