¿Cómo utilizar un parámetro de salida en Java?

¿Podría alguien por favor darme algún código de ejemplo que utiliza un parámetro de salida en función? He intentado Google pero lo encontré sólo en funciones. Me gustaría usar este valor de salida en otra función.

El código que estoy desarrollando pretende ser ejecutado en Android.

Java pasa por valor; No hay ningún parámetro como en C #.

Puede utilizar return o mutar un objeto pasado como referencia ( por valor).

Preguntas relacionadas

  • ¿Java tiene algo como la referencia y las palabras clave de C #? ? (¡NO!)
  • ¿Java pasa por referencia? (¡NO!)

Ejemplo de código

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

Ver también

  • ¿Qué se entiende por inmutable?
  • StringBuilder y StringBuffer en Java

En cuanto al código con el que OP necesita ayuda, aquí hay una solución típica de usar un valor especial (generalmente null para los tipos de referencia) para indicar el éxito o el fracaso:

En lugar 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; } 

En su lugar, utilice un tipo de retorno String , con null para indicar un error.

 String person = checkAddress("5556"); if (person != null) { print(person); } private String checkAddress(String address) { // on search succeeded: return something; : // on search failed: return null; } 

Así funciona java.io.BufferedReader.readLine() , por ejemplo: devuelve instanceof String (quizá una cadena vacía!), Hasta que devuelve null para indicar final de "search".

Esto no se limita a un valor de retorno de tipo de referencia, por supuesto. La clave es que tiene que haber algún valor especial (s) que nunca es un valor válido, y se utiliza ese valor para fines especiales.

Otro ejemplo clásico es String.indexOf : devuelve -1 para indicar fallo de búsqueda.

Nota : debido a que Java no tiene un concepto de parámetros "input" y "output", usar el prefijo i- y o- (por ejemplo, oPerson , oPerson ) es innecesario y unidiomático.


Una solución más general

Si necesita devolver varios valores, normalmente están relacionados de alguna manera (por ejemplo, coordenadas x e y de un solo Point ). La mejor solución sería encapsular estos valores juntos. Las personas han utilizado un Object[] o una List<Object> , o un Pair<T1,T2> genérico Pair<T1,T2> , pero en realidad, su propio tipo sería mejor.

Para este problema, recomiendo un tipo SearchResult inmutable como este para encapsular los resultados de búsqueda boolean y String :

 public class SearchResult { public final String name; public final boolean isFound; public SearchResult(String name, boolean isFound) { this.name = name; this.isFound = isFound; } } 

A continuación, en su función de búsqueda, haga lo siguiente:

 private SearchResult checkAddress(String address) { // on address search succeed return new SearchResult(foundName, true); : // on address search failed return new SearchResult(null, false); } 

Y luego lo usas así:

 SearchResult sr = checkAddress("5556"); if (sr.isFound) { String name = sr.name; //... } 

Si lo desea, puede (y probablemente debería) hacer que los campos inmutables final no sean public , y use getters public lugar.

Java no admite parámetros de salida. Puede utilizar un valor devuelto o pasar un objeto como parámetro y modificar el objeto.

Como solución, se puede utilizar un "ObjectHolder" genérico. Vea el siguiente ejemplo de código.

El resultado de la muestra es:

 name: John Doe dob:1953-12-17 name: Jim Miller dob:1947-04-18 

Por lo que el parámetro Person ha sido modificado ya que está envuelto en el titular que se pasa por valor – el param genérico dentro es una referencia donde el contenido puede ser modificado – por lo que en realidad una persona diferente se devuelve y el original se queda como está.

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

Puede utilizar:

  • Devuelve X. esto devolverá sólo un valor.

  • Devolver objeto. Devolverá un objeto completo. Por ejemplo, su objeto puede incluir valores X, Y y Z.

  • Pase. Las matrices se pasan por referencia. Es decir, si se pasa la matriz de enteros, se modifica la matriz dentro del método, entonces el código original verá los cambios.

Ejemplo de pasar Array.

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

Esto imprimirá: 4,5,6.

Envuelva el valor pasado en diferentes clases que podrían ser útiles haciendo el truco, compruebe a continuación para obtener un ejemplo más real:

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

Esto no es exacto —> "… * array de paso.las matrices se pasan por referencia, es decir, si se pasa la matriz de enteros, se modifica la matriz dentro del método.

Cada tipo de parámetro se pasa por valor en Java. Las matrices son objeto, su referencia de objeto se pasa por valor.

Esto incluye una matriz de primitivas (int, double, ..) y objetos. El valor entero se cambia por el métodoTwo () pero sigue siendo la misma referencia de objeto arr, el métodoTwo () no puede agregar un elemento de matriz o eliminar un elemento de matriz. MethodTwo () no puede, también, crear una nueva matriz y luego establecer esta nueva matriz a arr. Si realmente puede pasar un array por referencia, puede reemplazar ese arr con una nueva matriz de números enteros.

Cada objeto pasado como parámetro en Java se pasa por valor, sin excepciones.

Gracias. Utilizo pasar en un objeto como un parámetro. Mi código de Android está por debajo

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

El resultado es

Persona: John

¡Es partido! nulo

En realidad, "es el partido John"

Por favor, compruebe mi error.

  • Android - Cómo combinar dos ArrayLists
  • Mientras que (verdadero) lazo sin interrupción
  • Convertir minutos en milisegundos Java / android
  • Libavcodec.so: tiene relocalizaciones de texto
  • ¿Qué es Native Android con java?
  • Android - Transmisión adaptativa de velocidad de bits. (HLS) Calidad del flujo
  • AndroidRuntime Causado por: java.lang.unsatisfiedLinkError: No se pudo cargar tfp_jni: findLibrary returned null
  • Cómo llamar a Javascript __doPostBack de JSOUP
  • ProcessException: ExecException: Process 'command' /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Content/Home/bin/java
  • Causado por: java.lang.NoSuchFieldError: com.squareup.okhttp.internal.http.HttpMethod.METHODS cuando uso retrofit
  • PreferenceFragment.findPreference devuelve siempre NULL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.