Parámetros y Valores de Retorno
Cuando escribimos un proveedor de servicio, debemos tener
en mente ciertas reglas sobre cómo tratar los parámetros
de entrada y los valores de retorno. Estas reglas no sólo
afectan a la corrección del proveedor de servicio y por
último a la corrección del programa que lo usa, sino
que también tienen implicaciones de seguridad. Estas
reglas se aplican a llamadas a métodos sobre el interface
Context y sus subinterfaces
y se explican en las siguientes páginas.
Los Parámeteros son Propiedad del LLamador
Cuando un proveedor de servicio acepta un parámetro del
llamador como parte de una llamada a método, no debe
modificar los contenidos del parámetro. Supongamos que
un proveedor de servicio recibe un
java.util.Hashtable como
un parámetro de entorno. El no debe añadir, borrar o
modificar ningún ítem del Hashtable.
Si el proveedor debe usar una versión modificada del
Hashtable (por ejemplo,
borrando cualquier propiedad relacionada con la seguridad),
debe hacer esto sólo después de clonar el Hashtable.
En otro ejemplo, cuando el proveedor obtiene un parámetro
Name, no debe añadir, borrar o
modificar ningún componente del nombre.
Los Parámetros son Sólo Válidos Durante la Llamada
Un proveedor de servicio no debe manetener punteros a parámetros
más allá de la llamada a método. Si el proveedor de servicio debe
retener cierta información pasada en los parámetros, debe clonar
o copiar la información a variables accesibles localmente.
Por ejemplo, si un llamador invoca a
LdapContext.setRequestControls()
con un valor no-null
Control[], el proveedor de servicio
debería copiar el array antes de volver de la llamada.
Después de la llamada, cualquier cambio que el llamador haga en su
array no debería afectar al proveedor de servicio y viceversa.
Los Valores de Retorno son Propiedad del Llamador
Cuando un proveedor de servicio devuelve un objeto al llamador,
debería darle la propiedad del objeto. Entonces el llamador
es libre de hacer cambios en el objeto devuelto, y dichos
cambios no deberían afectar al proveedor de servicio.
Por ejemplo, si dos llamadores invocan a
LdapContext.getRequestControls(),
entonces el Control[] que
recibe cada uno es su propia copia. Cada llamador puede
manipular ese resultado sin afectar al otro llamador.
De forma similar, si dos llamadores invocan a
Context.getEnvironment(),
entonces el java.util.Hashtable
que recibe cada uno puede ser manipulado independientemente sin
que el otro llamador se vea afectado.
Para soportar este comportamiento, el proveedor de servicio
normalmente necesita clonar un resultado mutable (que puede
ser devuelto a varios llamadores) antes de devolverlo.