globales java language-agnostic parameters out-parameters

globales - Cómo crear parámetros IN OUT o OUT en Java



getproperty java (3)

Java copia todo lo que pasa como argumento. Si pasa un método primitivo, dentro, tiene una copia de esa primitiva, y ninguna modificación afectará la variable real del método externo. Si pasa un objeto, pasa una copia de referencia, que realmente hace referencia al objeto original. Esta es la forma en que puede propagar modificaciones al contexto de algo que llamó al método, modificando el estado del objeto al que apunta la referencia. Vea más sobre esto: ¿Java pasa por valor o por referencia?

En PL / SQL (o en muchos otros idiomas), puedo tener los parámetros IN OUT o OUT, que se devuelven de un procedimiento. ¿Cómo puedo lograr algo similar en Java?

Conozco este truco:

public void method(String in, String[] inOut, String[] inOut2) { inOut[0] = in; }

Donde el parámetro in representa un parámetro IN y el parámetro inOut puede contener un valor de retorno. La convención sería que String[] inOut es una matriz de inOut.length == 1 .

Eso es un poco torpe.

EDITAR Comentarios a las respuestas : Otros trucos incluyen:

  • clases de contenedor / contenedor, pero no quiero introducir ningún tipo nuevo, devoluciones de llamada, etc.
  • valores de retorno: me gustaría una solución general . Es decir, uno con varios parámetros IN OUT involucrados.
  • wrapper para el parámetro IN OUT como valor de retorno: Esa es una opción viable, pero aún no tan agradable, porque ese wrapper tendría que ser generado de alguna manera

¿Alguien sabe una mejor manera de lograr esto en general? La razón por la que necesito una solución general es porque quiero generar código fuente conveniente de PL / SQL en un esquema de base de datos.


Mi pregunta sería: ¿por qué el method no devuelve algo? En lugar de establecer un argumento de entrada / salida?

Pero asumiendo que usted absolutamente, positivamente debe tener un argumento de entrada / salida, que es una pregunta completamente diferente, entonces el truco de la matriz está bien. Alternativamente, no es menos torpe, pero la otra forma es pasar una referencia de objeto:

public class Foo { private String value; public Foo(String v) { this.value = v; } public String getValue() { return this.value; } public void setValue(String v) { this.value = v; } } // .... public void method(String in, Foo inOut) { inOut.setValue(in); }

(O, por supuesto, solo haz público el value ). ¿Ves? Dije que no era menos torpe.

Pero volvería a preguntar: ¿el method no puede devolver algo? Y si necesita devolver varias cosas, ¿no puede devolver una instancia de objeto con propiedades para esas cosas?

Fuera del tema: esta es una de las áreas en las que realmente me gusta el enfoque C #. Uno de los argumentos en contra de los argumentos de entrada / salida es que no están claros en el momento en que llamas a la función. Entonces, C # lo deja en claro, al especificar la palabra clave tanto en la declaración de la función como al invocarla. En ausencia de ese tipo de ayuda sintáctica, evitaría "simular" argumentos de entrada / salida.


No hay forma directa. Otra técnica incluye:

  • Pasar un objeto de soporte (un poco como tu matriz 1-aria)
  • Usando, por ejemplo, un AtomicInteger
  • Pasar un objeto más útil desde una perspectiva comercial que resulta ser mutable
  • Una devolución de llamada a una interfaz personalizada para recibir el resultado

Si lo piensas bien, el truco de arreglo no es diferente a pasar un T * en C / C ++