How to use an output parameter in Java?

JavaAndroidParameters

Java Problem Overview


Could someone please give me some sample code that uses an output parameter in function? I've tried to Google it but just found it just in functions. I'd like to use this output value in another function.

The code I am developing intended to be run in Android.

Java Solutions


Solution 1 - Java

Java passes by value; there's no out parameter like in C#.

You can either use return, or mutate an object passed as a reference (by value).


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

}
See also

As for the code that OP needs help with, here's a typical solution of using a special value (usually null for reference types) to indicate success/failure:

Instead of:

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

Use a String return type instead, with null to indicate failure.

String person = checkAddress("5556");
if (person != null) {
   print(person);
}

private String checkAddress(String address) {
   // on search succeeded:
   return something;
   :
   // on search failed:
   return null;
}

This is how java.io.BufferedReader.readLine() works, for example: it returns instanceof String (perhaps an empty string!), until it returns null to indicate end of "search".

This is not limited to a reference type return value, of course. The key is that there has to be some special value(s) that is never a valid value, and you use that value for special purposes.

Another classic example is String.indexOf: it returns -1 to indicate search failure.

> Note: because Java doesn't have a concept of "input" and "output" parameters, using the i- and o- prefix (e.g. iAddress, oPerson) is unnecessary and unidiomatic.


A more general solution

If you need to return several values, usually they're related in some way (e.g. x and y coordinates of a single Point). The best solution would be to encapsulate these values together. People have used an Object[] or a List<Object>, or a generic Pair<T1,T2>, but really, your own type would be best.

For this problem, I recommend an immutable SearchResult type like this to encapsulate the boolean and String search results:

public class SearchResult {
   public final String name;
   public final boolean isFound;

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

Then in your search function, you do the following:

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

And then you use it like this:

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

If you want, you can (and probably should) make the final immutable fields non-public, and use public getters instead.

Solution 2 - Java

Java does not support output parameters. You can use a return value, or pass in an object as a parameter and modify the object.

Solution 3 - Java

You can either use:

  • return X. this will return only one value.

  • return object. will return a full object. For example your object might include X, Y, and Z values.

  • pass array. arrays are passed by reference. i.e. if you pass array of integers, modified the array inside the method, then the original code will see the changes.

Example on passing 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;
    }
}

This will print out: 4,5,6.

Solution 4 - Java

As a workaround a generic "ObjectHolder" can be used. See code example below.

The sample output is:

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

so the Person parameter has been modified since it's wrapped in the Holder which is passed by value - the generic param inside is a reference where the contents can be modified - so actually a different person is returned and the original stays as is.

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

Solution 5 - Java

Wrap the value passed in different classes that might be helpful doing the trick, check below for more real example:

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

    }

Solution 6 - Java

This is not accurate ---> "...* pass array. arrays are passed by reference. i.e. if you pass array of integers, modified the array inside the method.

Every parameter type is passed by value in Java. Arrays are object, its object reference is passed by value.

This includes an array of primitives (int, double,..) and objects. The integer value is changed by the methodTwo() but it is still the same arr object reference, the methodTwo() cannot add an array element or delete an array element. methodTwo() cannot also, create a new array then set this new array to arr. If you really can pass an array by reference, you can replace that arr with a brand new array of integers.

Every object passed as parameter in Java is passed by value, no exceptions.

Solution 7 - Java

Thank you. I use passing in an object as a parameter. My Android code is below

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

The result is

> Person : John > > It's Match! null

Actually, "It's Match! John"

Please check my mistake.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsocloseView Question on Stackoverflow
Solution 1 - JavapolygenelubricantsView Answer on Stackoverflow
Solution 2 - JavaSingleShotView Answer on Stackoverflow
Solution 3 - JavamedopalView Answer on Stackoverflow
Solution 4 - JavaWolfgang FahlView Answer on Stackoverflow
Solution 5 - JavaMuhammad SolimanView Answer on Stackoverflow
Solution 6 - Javaedvox1138View Answer on Stackoverflow
Solution 7 - JavasocloseView Answer on Stackoverflow