Как использовать выходной параметр в Java?
Может кто-нибудь, пожалуйста, дайте мне пример кода, который использует выходной параметр в функции? Я пытался использовать Google, но просто нашел это только в функциях. Я хотел бы использовать это выходное значение в другой функции.
Код, который я разрабатываю, предназначен для запуска в Android.
Ответы
Ответ 1
Java проходит по значению; там нет параметра out
, как в С#.
Вы можете использовать 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
getters.
Ответ 2
Java не поддерживает выходные параметры. Вы можете использовать возвращаемое значение или передать объект в качестве параметра и изменить объект.
Ответ 3
В качестве обходного пути можно использовать общий "ObjectHolder". См. Пример кода ниже.
Выходной сигнал выборки:
name: John Doe
dob:1953-12-17
name: Jim Miller
dob:1947-04-18
поэтому параметр Person был изменен, так как он был завершен в Holder, который передается по значению - общий параметр внутри - это ссылка, в которой содержимое может быть изменено, поэтому на самом деле возвращается другой человек, а оригинал остается как есть.
/**
* 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 String name;
public String dob;
public void show() {
System.out.println("name: "+name+"\ndob:"+dob);
}
}
/**
* ObjectHolder (Generic ParameterWrapper)
*/
public static class ObjectHolder<T> {
public ObjectHolder(T param) {
this.param=param;
}
public T param;
}
/**
* ObjectHolder is substitute for missing "out" parameter
*/
public static void setPersonData(ObjectHolder<Person> personHolder,String name,String 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(String args[]) {
Person jim=new Person();
jim.name="Jim Miller";
jim.dob="1947-04-18";
ObjectHolder<Person> 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();
}
}
Ответ 4
Вы можете использовать:
-
return X. это вернет только одно значение.
-
вернуть объект. вернет полный объект. Например, ваш объект может включать значения X, Y и Z.
-
передать массив. массивы передаются по ссылке. т.е. если вы передадите массив целых чисел, измените массив внутри метода, тогда исходный код увидит изменения.
Пример передачи массива.
void methodOne{
int [] arr = {1,2,3};
methodTwo(arr);
...//print arr here
}
void methodTwo(int [] arr){
for (int i=0; i<arr.length;i++){
arr[i]+=3;
}
}
Это будет печатать: 4,5,6.
Ответ 5
Оберните значение, переданное в разных классах, что может быть полезно для выполнения трюка, посмотрите ниже для более реального примера:
class Ref<T>{
T s;
public void set(T value){
s = value;
}
public T get(){
return s;
}
public Ref(T value) {
s = value;
}
}
class Out<T>{
T s;
public void set(T value){
s = value;
}
public T get(){
return s;
}
public Out() {
}
}
public static void doAndChangeRefs (Ref<String> str, Ref<Integer> i, Out<String> str2){
//refs passed .. set value
str.set("def");
i.set(10);
//out param passed as null .. instantiate and set
str2 = new Out<String>();
str2.set("hello world");
}
public static void main(String args[]) {
Ref<Integer> iRef = new Ref<Integer>(11);
Out<String> strOut = null;
doAndChangeRefs(new Ref<String>("test"), iRef, strOut);
System.out.println(iRef.get());
System.out.println(strOut.get());
}
Ответ 6
Это неточно --- > "... * pass array. массивы передаются по ссылке, т.е. если вы передаете массив целых чисел, измените массив внутри метода.
Каждый тип параметра передается по значению в Java. Массивы - это объект, его ссылка на объект передается по значению.
Это включает в себя массив примитивов (int, double,..) и объектов. Целочисленное значение изменяется методомTwo(), но оно все равно является одной и той же ссылкой об объекте arr, методTwo() не может добавить элемент массива или удалить элемент массива. methodTwo() также не может создать новый массив, а затем установить этот новый массив в arr. Если вы действительно можете передать массив по ссылке, вы можете заменить этот arr на новый массив целых чисел.
Каждый объект, переданный как параметр в Java, передается по значению, без исключений.
Ответ 7
Спасибо. Я использую передачу объекта в качестве параметра. Мой Android-код находится ниже
String oPerson= null;
if (CheckAddress("5556", oPerson))
{
Toast.makeText(this,
"It Match! " + oPerson,
Toast.LENGTH_LONG).show();
}
private boolean CheckAddress(String iAddress, String oPerson)
{
Cursor cAddress = mDbHelper.getAllContacts();
String address = "";
if (cAddress.getCount() > 0) {
cAddress.moveToFirst();
while (cAddress.isAfterLast() == false) {
address = cAddress.getString(2).toString();
oPerson = cAddress.getString(1).toString();
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;
}
Результат
Человек: Джон
Это матч! нуль
Собственно, "It Match! John"
Пожалуйста, проверьте мою ошибку.