In Java all parameters are strictly input. There are no output parameters. Anything you need to return from a function needs to be returned through the function return value.
[Here's a rationale for why Java disallows out parameters.]
Of course what I said is not strictly true that if you pass an object to a function, you can change a member variable of the object within the function and that would be a way to pass a value back to the caller.
But it is often the case, you want two values to be passed back to the caller. With Java, you would need to implement a little class with these two objects and pass that class back. This is the example I'm going through today:
I need to get a resultset from a JDO query. So I would like to move the JDO queries to a Manager class, and code a function like:
Collection getResults(PersistenceManager pm);
But the problem is that inside getResults, I need to instantiate a query object that takes up some database resources on the client side. It is a good idea to clean up the query object so that the database handles could be freed. It is very important if the query is executed repeatedly in a loop, or if the result set is large.
The nice thing about using the above call at the call site is its elegance:
Collection results = mgr.getResults(pm);
for (Object o : results) {
// process the result records
}
Now this would change to something like:
CollectionAndQuery cq = results.getResults(pm);
for (Object o: cq.results) {
// process
}
cq.query.closeAll();
And the CollectionAndQuery class has to be defined at global scope as it is needed in both the call site and the manager.
Now, if Java had a generic Pair object, we could have used that for this purpose. [CollectionAndQuery is really a specialized Pair object] Unfortunately there is no Pair object in Java.
No comments:
Post a Comment