Java passe par là, il n'y a pas d' out
paramètre comme en C#.
Vous pouvez soit utiliser return
, ou de muter un objet passé comme une référence (par valeur).
Questions connexes
Exemple de Code
public class FunctionSample {
static String fReturn() {
return "Hello!";
}
static void fArgNoWorkie(String s) {
s = "What am I doing???"; // Doesn't "work"! Java passes by value!
}
static void fMutate(StringBuilder sb) {
sb.append("Here you go!");
}
public static void main(String[] args) {
String s = null;
s = fReturn();
System.out.println(s); // prints "Hello!"
fArgNoWorkie(s);
System.out.println(s); // prints "Hello!"
StringBuilder sb = new StringBuilder();
fMutate(sb);
s = sb.toString();
System.out.println(s); // prints "Here you go!"
}
}
Voir aussi
Comme pour le code que l'OP a besoin d'aide, voici une solution typique de l'utilisation d'une valeur particulière (habituellement null
pour les types de référence) pour indiquer la réussite/échec:
Au lieu de:
String oPerson= null;
if (CheckAddress("5556", oPerson)) {
print(oPerson); // DOESN'T "WORK"! Java passes by value; String is immutable!
}
private boolean CheckAddress(String iAddress, String oPerson) {
// on search succeeded:
oPerson = something; // DOESN'T "WORK"!
return true;
:
// on search failed:
return false;
}
Utiliser un String
type de retour au lieu de cela, avec null
pour indiquer l'échec.
String person = checkAddress("5556");
if (person != null) {
print(person);
}
private String checkAddress(String address) {
// on search succeeded:
return something;
:
// on search failed:
return null;
}
C'est combien de java.io.BufferedReader.readLine()
de travaux, par exemple: elle retourne instanceof String
(peut-être une chaîne vide!), jusqu'à ce qu'il retourne null
pour indiquer la fin de la "recherche".
Ce n'est pas limité à un type de référence valeur de retour, bien sûr. La clé est qu'il y a à être une valeur spéciale(s) qui n'est pas une valeur valide, et que vous utilisez cette valeur pour des fins spéciales.
Un autre exemple classique est - String.indexOf
: elle retourne -1
pour indiquer la défaillance de recherche.
Remarque: parce que Java ne dispose pas d'un concept de "entrée" et "sortie" des paramètres, à l'aide de l' i-
et o-
préfixe (par exemple, iAddress
, oPerson
) est inutile et unidiomatic.
Plus générale de la solution
Si vous avez besoin de retourner plusieurs valeurs, généralement elles sont liées d'une certaine façon (par exemple, x
et y
coordonnées d'un seul Point
). La meilleure solution serait d'incarner ces valeurs. Les gens ont utilisé un Object[]
ou List<Object>
, ou un générique Pair<T1,T2>
, mais vraiment, votre propre type serait le mieux.
Pour ce problème, je recommande immuable SearchResult
type de ce genre pour encapsuler l' boolean
et String
résultats de recherche:
public class SearchResult {
public final String name;
public final boolean isFound;
public SearchResult(String name, boolean isFound) {
this.name = name;
this.isFound = isFound;
}
}
Puis dans votre fonction de recherche, vous effectuez les opérations suivantes:
private SearchResult checkAddress(String address) {
// on address search succeed
return new SearchResult(foundName, true);
:
// on address search failed
return new SearchResult(null, false);
}
Et puis vous l'utiliser comme ceci:
SearchResult sr = checkAddress("5556");
if (sr.isFound) {
String name = sr.name;
//...
}
Si vous le souhaitez, vous pouvez (et devriez) faire l' final
immuable champs non-public
, et l'utilisation public
getters à la place.