Java проходит по значению; нет параметра out
, как в C #.
Вы можете использовать return
или изменить объект, переданный как ссылку ( по значению).
Похожие вопросы
Пример кода
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!"
}
}
Смотри также
Что касается кода , с которым OP требуется помощь, вот типичное решение использования специального значения (обычно null
для ссылочных типов) для указания успеха / неудачи:
Вместо:
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;
}
Вместо этого используйте тип возврата String
, с null
для обозначения ошибки.
String person = checkAddress("5556");
if (person != null) {
print(person);
}
private String checkAddress(String address) {
// on search succeeded:
return something;
:
// on search failed:
return null;
}
Так работает, например, java.io.BufferedReader.readLine()
: он возвращает instanceof String
(возможно, пустую строку!), Пока не вернет null
, чтобы указать конец «поиска».
Конечно, это не ограничивается возвращаемым значением ссылочного типа. Ключ в том, что должно быть какое-то специальное значение (я), которое никогда не является допустимым значением, и вы используете это значение для специальных целей.
Другой классический пример: String.indexOf
: он возвращает -1
, чтобы указать на ошибку поиска.
Примечание : поскольку в Java нет понятия параметров «ввода» и «вывода», используется префикс i-
и o-
(например, iAddress
, oPerson
) ненужный и однотипный.
Более общее решение
Если вам нужно вернуть несколько значений, обычно они связаны каким-либо образом (например, x
и y
координаты одного Point
). Лучшим решением было бы объединить эти значения вместе. Люди использовали Object[]
или List<Object>
, или универсальный Pair<T1,T2>
, но на самом деле ваш собственный тип был бы лучшим.
Для этой проблемы я рекомендую неизменный тип SearchResult
, подобный этому, для инкапсуляции результатов поиска boolean
и String
:
public class SearchResult {
public final String name;
public final boolean isFound;
public SearchResult(String name, boolean isFound) {
this.name = name;
this.isFound = isFound;
}
}
Затем в функции поиска вы делаете следующее:
private SearchResult checkAddress(String address) {
// on address search succeed
return new SearchResult(foundName, true);
:
// on address search failed
return new SearchResult(null, false);
}
А потом вы используете это так:
SearchResult sr = checkAddress("5556");
if (sr.isFound) {
String name = sr.name;
//...
}
Если вы хотите, вы можете (и, вероятно, должны) сделать final
неизменяемые поля не public
и использовать вместо них public
getter.