Подтвердить что ты не робот

Как использовать выходной параметр в Java?

Может кто-нибудь, пожалуйста, дайте мне пример кода, который использует выходной параметр в функции? Я пытался использовать Google, но просто нашел это только в функциях. Я хотел бы использовать это выходное значение в другой функции.

Код, который я разрабатываю, предназначен для запуска в Android.

4b9b3361

Ответ 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"

Пожалуйста, проверьте мою ошибку.