Preamble: I am aware of using a list or other collections to return a result but then I have to go through the list plucking the results out: see 2nd example
Preamble-2: I'm looking for an answer beyond "this is not supported in Java ..."
I'm looking for a convenient way to return multiple objects from a Java method call.
Kind of like in PHP:
list ($obj1, $obj2, ...) foobar();
I'm really getting tired of passing holder objects in the arguments for example:
class Holder {
int value;
}
Holder h1=new Holder();
Holder h2=new Holder();
and then:
o.foobar(h1,h2);
... would be very interested if someone has figured an elegant way to get round this.
Using a list
List<String> = foobar();
There are two drawbacks to this:
I have to first pack the List on the callee side of the house:
// this is on the callee side of the house
ArrayList<String> result = new ArrayList<String>
result.add("foo");
result.add("bar");
Then on the caller side I have to pluck the results out:
// This is on the caller side
List<String> result = foobar();
String result1 = result.get(0);
String result2 = result.get(1); // this is not as elegant as the PHP equivalent
Further, say I wanted to return objects of different types say String, Integer I would have to return a list of Objects and then cast each object ... not pretty
Thanks.
Using a generic tuple class is the closest I can imagine. To give an idea, such general purpose class for three return values could look something like this:
public class T3<A, B, C> {
A _1;
B _2;
C _3;
T3(A _1, B _2, C _3) {
this._1 = _1;
this._2 = _2;
this._3 = _3;
}
}
This allows a one statement constructor on the callee side, for example:
public T3<String, Integer, Character> getValues() {
return new T3<String, Integer, Character>("string", 0, 'c');
}
but no holder instance construction by the callee is to be done.
Each number of return values needs a tuple-class of its own. There might be something like that provided in the Functional Java library. For reference, here's an N-Tuple implementation.
For the two-valued case java.util.AbstractMap.SimpleEntry would do:
return new SimpleEntry<String, Integer>("string", 0);
Anyhow, I see two important points to consider for multiple return values:
As boring as it is, I'd recommend creating a separate class to hold all the response values and declare that as the method return type. That way the meaning of each value can be highlighted.
You can have a method like with a signature like this :
List<Holder> foobar();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With