Comment créer DANS ou HORS des paramètres en Java
En PL/SQL (ou d'autres langues), je peux avoir DANS ou HORS de paramètres, qui sont renvoyés d'une procédure. Comment puis-je obtenir quelque chose de similaire dans Java?
Je connais cette astuce:
public void method(String in, String[] inOut, String[] inOut2) {
inOut[0] = in;
}
Où la in
paramètre représente un paramètre et la inOut
paramètre peut contenir une valeur de retour. La convention serait que String[] inOut
est un tableau de inOut.length == 1
.
C'est un peu maladroit.
MODIFIER les Commentaires de réponses: d'Autres astuces comprennent:
- titulaire/classes wrapper, mais je ne veux pas introduire de nouveaux types, les rappels, etc.
- les valeurs de retour: je voudrais un général solution. I. e. un avec plusieurs DANS des paramètres impliqués.
- wrapper pour EN paramètre une valeur de retour: C'est une option viable, mais encore pas très agréable, parce que wrapper devrait être obtenu, en quelque sorte
Quelqu'un sait-il une meilleure façon d'atteindre cet objectif d'une manière générale? La raison j'ai besoin d'une solution générale est parce que je veux générer la commodité du code source à partir PL/SQL dans un schéma de base de données.
Quand j'ai commencé l'apprentissage de Java, après de nombreuses années de développement C/C++, j'ai aussi cherché un moyen de passer par référence. Mais maintenant, des années après, je n'ai plus de rappeler la dernière fois que je voulais le faire. Le tableau astuce est moins élégant que d'autres approches citées dans ces réponses et commentaires.
OriginalL'auteur Lukas Eder | 2010-12-15
Vous devez vous connecter pour publier un commentaire.
Ma question serait: Pourquoi ne pas
method
retour quelque chose? Plutôt que de fixer un in/out argument?Mais en supposant que vous doit absolument, positivement ont un in/out argument, qui est une toute autre question, alors la matrice de truc, c'est bien. Alternativement, il n'est pas moins maladroit, mais l'autre façon est de laisser un objet de référence:
(Ou, bien sûr, il suffit de faire
value
public). Voir? J'ai dit que ce n'était pas le moins maladroit.Mais je vous demande encore une fois: ne Peut pas
method
retourner quelque chose? Et si elle a besoin de retourner plusieurs choses, ne peut-il pas retourner une instance de l'objet avec les propriétés de ces choses?Hors-sujet: C'est l'un des endroits où j'aime vraiment le C# approche. Un des arguments contre les in/out arguments est qu'ils ne sont pas clairs à l'endroit où vous êtes appel la fonction. Donc, C# fait de vous faire comprendre, en spécifiant le mot-clé à la fois à la déclaration de la fonction et lors de l'appel. En l'absense de ce genre de syntaxique de l'aide, j'aimerais éviter de "simuler" in/out arguments.
Vous avez raison au sujet de votre hors-sujet commentaire. En général je n'ai pas besoin DE paramètres de SORTIE. Mais comme je suis de la génération du code source à partir de la réalité de code PL/SQL, je ne peux pas faire sans... :-/
Dans mon cas, j'ai besoin inout parce que la méthode est déjà de retour quelque chose d'autre.
OriginalL'auteur T.J. Crowder
Java des copies de tout ce que vous passé en argument. Si vous passez un primitif, à l'intérieur de la méthode que vous avez copie de cette primitive, et aucune modification n'affectera la variable réelle en dehors de la méthode. Si vous passez de l'objet, de vous transmettre copie de référence, ce qui en fait des références à l'objet d'origine. C'est de cette façon que vous pouvez propager les modifications pour le contexte de quelque chose qui a appelé la méthode - par la modification de l'état de l'objet, la référence est à diriger. En voir plus sur cette: Java Passage par Valeur ou par Référence?
+1 pour le fait d'expliquer le passage par valeur sémantique de Java utilise de manière logique. Il y a trop peu de gens comme vous dans le monde d'aujourd'hui...
savoir que Java ne passe pas réelle des pointeurs mais référence de "copies", Qui est juste un autre terme pour les pointeurs. 😉
Crowder: pour autant Que je sais en C/C++, vous pouvez affecter une nouvelle valeur à un pointeur qui sera en mesure de quitter le champ d'application de la méthode. En Java, ce n'est pas possible, Arturs correctement expliqué. Le "pointeur" est passé par valeur de la méthode, et non par référence
ce que je sais en C/C++, vous pouvez affecter une nouvelle valeur à un pointeur qui sera en mesure de quitter le champ d'application de la méthode. En Java, c'est pas possible..." Java références de l'objet (
void foo(MyObject m)
) sont exactes des analogues de C/C++ les pointeurs (void foo(MyObject *pm)
). Vous pouvez attribuer àm
(Java), oump
(C/C++), mais qui n'ont pas d'effet sur quelque chose d'extérieurfoo
. Mais le C/C++ les pointeurs pour les pointeurs:void foo(MyObject **ppm)
, où l'effet de l'écriture à*ppm
peut être vu dans l'appel de la méthode. Java analogique est le tableau le truc de l'OP marqué.OriginalL'auteur Arturs Licis
Il n'y a pas de manière directe. Autre technique:
Si vous pensez à ce sujet, le tableau de truc n'est pas sans rappeler le passage d'un T* en C/C++
OriginalL'auteur dty