Intereting Posts
Как сообщить Android NDK использовать другую инструментальную цепочку Android-разрешения: телефонные звонки: состояние и идентификация телефона Установить URL-адрес изображения для просмотра изображения Пользовательский вид onMeasure: как получить ширину по высоте UnsupportedMethodException Android Studio 2.2 Spring RestTemplate HTTP-сообщение с параметрами вызывает ошибку 400 ошибок Как найти максимальный размер текстуры для разных телефонов? Куда идет отступы, когда устанавливаете фон Drawable? Как мы можем получить arraylist (как строку, так и целое число) из ресурсов xml Цвет текущей вкладки TabWidget Android-эмулятор против реального устройства Внедрение рекомендаций по дизайну Google для слайдеров Datepicker: как всплывать datepicker при нажатии на кнопку и хранить значение в переменной Список разрешений Android для обычных разрешений и опасных разрешений в API 23? Отображать push-уведомление в поле предупреждения, когда приложение работает на переднем плане

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

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

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

Solutions Collecting From Web of "Как использовать выходной параметр в Java?"

Java проходит по значению; Нет параметра out как в C #.

Вы можете либо использовать return , либо мутировать объект, переданный как ссылку ( по значению).

Связанные вопросы

  • Есть ли у Java что-то вроде ссылок на ключевые слова C #? ? (НЕТ!)
  • Является ли Java передачей по ссылке? (НЕТ!)

Образец кода

 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!" } } 

Смотрите также

  • Что подразумевается под неизменным?
  • StringBuilder и StringBuffer в Java

Что касается кода, которому нужна помощь 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 геттеры.

Java не поддерживает выходные параметры. Вы можете использовать возвращаемое значение или передать объект в качестве параметра и изменить объект.

В качестве обходного пути можно использовать общий «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(); } } 

Вы можете использовать:

  • 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.

Оберните значение, пройденное в разных классах, что может быть полезно сделать трюк, посмотрите ниже для более реального примера:

  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()); } 

Это неточно —> «… * pass array. Массивы передаются по ссылке, т. Е. Если вы передаете массив целых чисел, измените массив внутри метода.

Каждый тип параметра передается по значению в Java. Массивы – это объект, его ссылка на объект передается по значению.

Это включает в себя массив примитивов (int, double, ..) и объектов. Целочисленное значение изменяется методом methodTwo (), но оно все равно является одной и той же ссылкой об объекте arr, методTwo () не может добавить элемент массива или удалить элемент массива. MethodTwo () также не может создать новый массив, а затем установить этот новый массив в arr. Если вы действительно можете передать массив по ссылке, вы можете заменить этот arr на новый массив целых чисел.

Каждый объект, переданный как параметр в Java, передается по значению, без исключений.

Спасибо. Я использую передачу объекта в качестве параметра. Мой Android-код ниже

  String oPerson= null; if (CheckAddress("5556", oPerson)) { Toast.makeText(this, "It's 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; } 

В результате

Лицо: Джон

Это матч! ноль

На самом деле, «Это матч! Джон»

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