CORBA
includes the concept of output parameters, which are parameters that
are uninitialized at the time of a call to a CORBA operation (CORBA
operations map to Java methods), then initialized by the operation,
and returned to the caller. Many IOM objects have operations that
use output parameters.
Unfortunately, the concept
of output parameters does not map well into Java. In Java method calls,
parameters of primitive types are always passed by value and parameters
of reference types are always passed by reference. In general, only
the member variables of an object or elements of an array can be modified
during a method call and returned to the caller. Furthermore, some
objects are immutable, which means their members cannot be changed
after the objects are constructed. Java CORBA programmers need a general
way to use both primitive types and reference types for output parameters
in method calls on Java CORBA stubs.
For this purpose, each
data type that can be used for an output parameter in a method call
on a Java CORBA stub is associated with a
Holder
class. A
Holder
class is a wrapper that
has one public member variable of the targeted data type. When a
Holder
is used in a method call on a Java CORBA stub,
the method implementation can set the member variable of the
Holder
to be the output value of the parameter, and
the caller can fetch that value by getting the value of the member
variable.
The value of the member
variable in a
Holder
object before it is
used in a method call with an output parameter is ignored, and, in
the case of
Holder
classes for reference
types, it can be
null
.
CORBA also includes
the concept of update parameters, which are parameters that are initialized
by the caller of a CORBA operation, possibly modified by the operation,
and returned to the caller. In Java CORBA stubs,
Holder
classes are also used to handle update parameters.
For example, here is
the definition of the class
org.omg.CORBA.IntHolder
, which is the
Holder
class for the Java
primitive type
int
:
final public class IntHolder
{
public int value;
public IntHolder()
{
}
public IntHolder(int initial)
{
value = initial;
}
}
The following example
shows how the
org.omg.CORBA.IntHolder
class
could be used in a method call that requires an output
int
parameter:
org.omg.CORBA.IntHolder intHolder = new org.omg.CORBA.IntHolder();
myApplication.myMethod(intHolder);
int intValue = intHolder.value;