10
votes

Comment créer des paramètres Out ou Out en Java

dans PL / SQL (ou de nombreuses autres langues), je peux avoir des paramètres OUT ou OUT, qui sont renvoyés à partir d'une procédure. Comment puis-je obtenir une chose similaire dans Java?

Je connais ce truc: xxx

où le paramètre in représente un paramètre et le Inout Le paramètre peut contenir une valeur de retour. La convention serait que chaîne [] inout est une matrice de inuite.length == 1 .

C'est un peu maladroit.

Modifier les commentaires aux réponses : Autres astuces incluent:

  • CLASSES DE PORTE-TIPS / CLASSE, mais je ne veux pas introduire de nouveaux types, rappels, etc.
  • Valeurs de retour: Je voudrais une solution générale . C'est à dire. un avec plusieurs paramètres de sortie impliqués.
  • wrapper pour le paramètre de sortie en tant que valeur de retour: c'est une option viable, mais toujours pas si agréable, car ce wrapper devrait être généré en quelque sorte

    Est-ce que quelqu'un sait un meilleur moyen d'y parvenir en général? La raison pour laquelle j'ai besoin d'une solution générale est parce que je souhaite générer un code source de commodité de PL / SQL dans un schéma de base de données.


2 commentaires

"Valeurs de retour: J'aimerais une solution générale. C'est-à-dire une avec plusieurs paramètres de sortie impliqués" voir ma réponse. Plusieurs paramètres par in / out? Renvoie une instance d'objet avec des propriétés pour chacun. Sauf que, non, il n'y a rien de mieux que le tour de la matrice.


Quand j'ai commencé à apprendre Java, après de nombreuses années de développement C / C ++, j'ai également cherché un moyen de passer par référence. Mais maintenant, des années après cela, je ne peux plus me rappeler la dernière fois que je voulais faire ça. Le truc de tableau est moins élégant que d'autres approches citées dans ces réponses et commentaires.


3 Réponses :


12
votes

Ma question serait la suivante: pourquoi ne retour quelque chose? Plutôt que de définir un argument dans / sortant?

Mais vous supposant que absolument, de manière positive avoir un argument d'entrée dans / sorti, qui est une question complète, alors le truc de tableau est bien. Alternativement, ce n'est pas moins maladroit, mais l'autre moyen est de passer dans une référence d'objet: xxx

(ou, bien sûr, faites simplement une valeur public.) Voir? J'ai dit que ce n'était pas moins maladroit.

Mais je demanderais à nouveau: ne peut pas méthode renvoyer quelque chose? Et s'il doit renvoyer plusieurs choses, je ne peux pas renvoyer une instance d'objet avec des propriétés pour ces choses?

hors sujet: C'est l'un des domaines où je suis vraiment comme l'approche C #. L'un des arguments contre les arguments d'entrée d'entrée est qu'ils ne sont pas clairs au point où vous êtes appeler la fonction. Donc, c # vous fait préciser, en spécifiant le mot-clé à la fois à la déclaration de la fonction et lorsque vous l'appelez. Dans l'absence de ce type d'aide syntaxique, j'éviterais des arguments de "simulation" dans / arrière.


3 commentaires

La méthode ne pourra pas renvoyer une seule valeur, car j'ai besoin d'une solution Général . J'ai adapté l'exemple pour tenir plusieurs paramètres Out Out. Mais peut-être retourner un objet de résultat généré (en maintenant les paramètres in sortés) pourraient en réalité être une option. +1 pour ça.


Vous avez raison sur votre commentaire hors sujet. En général, je n'ai pas besoin de paramètres. Mais comme je génère un code source du code PL / SQL réel, je ne peux pas faire sans ...: - /


Dans mon cas, j'ai besoin d'inonder parce que la méthode renvoie déjà autre chose.



1
votes

Il n'y a pas de mauvaise façon. Une autre technique comprend:

  • Passer un objet de support (un peu comme votre tableau 1-ARY)
  • en utilisant, par exemple, un atomicinteger
  • transmettre un objet plus utile d'une perspective commerciale qui se trouve être mutable
  • Un rappel à une interface personnalisée pour recevoir le résultat

    Si vous y pensez, le truc de tableau n'est pas différent de passer un T * en C / C ++


1 commentaires

Merci pour vos notes. J'ai pensé à ces choses aussi, malheureusement, ils ne travailleront pas dans mon cas ...



4
votes

Java copie tout ce que vous passez comme un argument. Si vous passez une méthode primitive, vous avez une copie de cette primitive et aucune modification n'affectera la méthode extérieure variable réelle. Si vous passez objet, vous passez une copie de référence, qui fait référence à l'objet d'origine. C'est la façon dont vous pouvez propager les modifications au contexte de quelque chose qui appelait la méthode - en modifiant l'état de l'objet que la référence est "pointant". En voir plus Sinon: Java passe-t-il par valeur ou par référence ?


7 commentaires

Merci, je sais que Java ne passe pas les pointeurs réels, mais des "copies de référence". C'est pourquoi j'ai trouvé le tour de la matrice. C'est un moyen très courant de simuler des pointeurs en Java ...


+1 pour expliquer en réalité la sémantique passe-valeur, Java utilise de manière logique. Il y a trop peu de gens comme vous dans le monde d'aujourd'hui ...


@Lukas: Je sais que Java ne passe pas les pointeurs réels, mais "Copies de référence" Ce qui n'est qu'un autre terme pour les pointeurs. ;-)


@ T.J. Crowder: Pour autant que je sache en C / C ++, vous pouvez attribuer une nouvelle valeur à un pointeur qui sera en mesure de quitter la portée de la méthode. En Java, cela n'est pas possible, comme l'expliquait correctement. Le "pointeur" est transmis par la valeur à la méthode, pas par référence


@Lukas: "Autant que je sache en C / C ++, vous pouvez affecter une nouvelle valeur à un pointeur qui sera capable de quitter la portée de la méthode. En Java, ce n'est pas possible ..." << / i> Les références d'objet de Java ( Void FOO (MyObject M) ) sont des analogues exacts des pointeurs C / C ++ ( Void FOO (MyObject * PM) ). Vous pouvez attribuer à m (java) ou mp (C / C ++), mais qui n'a aucun effet sur quoi que ce soit à l'extérieur foo . Mais C / C ++ a des pointeurs aux pointeurs : void foo (myObject ** ppm) , où l'effet de l'écriture sur * ppm peut être vu dans la méthode d'appel. L'analogue de Java est le truc de la matrice que l'OP a marqué.


@Lukas: (continue) mais accordé, je ne pense pas immédiatement à un Java équivalent à un pointeur à un pointeur à un pointeur , Void FOO (MyObject *** PPPM) . :-)


Ok, c'est ce que je voulais dire. Merci pour la clarification