Renvoyer plusieurs valeurs à partir d'une méthode Java: pourquoi pas un n-tuple objets?
Pourquoi n'est-il pas (standard, Java certifié) solution, dans le cadre du langage Java lui-même, de retourner plusieurs valeurs à partir d'une méthode en Java, plutôt qu'aux développeurs d'avoir à utiliser leurs propres moyens, tels que des Cartes, des Listes, des Paires, etc.? Pourquoi ne prend pas en charge Java n-tuple objets?
Spécialement pensée pour trivial méthodes privées qui peuvent modifier deux objets (en tandem), et dans ce cas, un typée-objet comme un retour sons overkill.
- Hm.............? En utilisant de telles structures de données de la norme, non?
- Parce que personne ne fait le travail pour prendre l'une de ces solutions personnalisées et de l'uniformiser, bien sûr!
- Il y a un moyen standard: il est appelé un objet.
- oui, ceux qui sont à la structure de données standard, mais il n'existe pas de moyens de le mettre dans le cadre de la construction du langage plutôt que l'enveloppant dans les collections? une analogie simple, si vous me le permettez, c'est que vous pourriez passer plusieurs arguments d'une méthode de deux façons: (a). Ont un seul paramètre variable qui est une Liste<?>, et extraire des paramètres de lui ou de (b). ont différentes variables de paramètre pour chaque argument. Il suffit de penser à haute voix...
- Ce que vous essayez de faire est non-standard. Les approches Standard incluent l'utilisation des cartes, des listes ou des objets personnalisés!
- peut-être que ça sonne "non-standard", car il n'y a pas de norme en tant que telle encore, qui est ce que suis en train de chercher 🙂 Encore une fois, je suis juste essayer d'ouvrir la discussion.
- Double Possible de stackoverflow.com/questions/457629/...
- J'ai vu le post ci-dessus, qui parle de comment pour ce faire. Mais ce que j'essaie d'ouvrir est pourquoi de tels moyens nécessaires.
- "Je suis juste essayer d'ouvrir la discussion": les discussions ne sont pas le style recommandé ici. Voir stackoverflow.com/faq#dontask
- littéralement 🙂 . Je suis en train de (avec peut-être quelques autres) comprendre/apprendre la théorie derrière tout cela.
- Voir aussi: stackoverflow.com/questions/457775/does-java-need-tuples
- Peut-être que java est de le faire pour vous forcer à utiliser ", du nom du style" les valeurs de retour, donc il n'y a pas de confusion quant à ce qui est de commencer retourné...
- D'autres langues ce faire, avoir un laissez-passer-par-syntaxe de référence (ou un pseudo par référence, comme l'utilisation de & (adresse de l'opérateur) en C ou C++. C'est la façon dont les gens s'autour d'elle "de retour dans les vieux jours". Je suis en train de décider comment le faire pour quelque chose et que je peut choisir le private static de la classe expliqué ci-dessous comme étant la réponse choisie.
- Pourquoi ne pas créer votre propre Tuple de la classe comme dans cette question ?
Vous devez vous connecter pour publier un commentaire.
Je suppose que l'OP signifie "Pourquoi ne prend pas en charge Java n-tuple objets?".
Python, Haskell, Lisp, ML, etc. ont hétérogène n-tuple de capacités. Aussi le plus souvent la capacité de apparemment de retour de plusieurs objets dans une langue est syntaxiques de sucre (c'est à dire en python de retour 'a','b').
La raison en est bien sûr la langue de la conception et de la cohérence. Java préfère être très explicite et n'aime pas les anonymes structures de données (bien que je souhaite que nous avions anonyme fermetures).
Par exemple en Java, il n'existe aucun moyen de dire je veux un rappel qui prend ces paramètres de type et retourne cette. Certaines personnes se sentent ce une énorme faiblesse d'autres, comme la cohérence et la précision.
À mon humble avis même si c'est agaçant j'ai souvent lutter contre ce problème en faisant static inline classes:
Oui, c'est fastidieux, mais ensuite, plus tard, j'ai, souvent, de réutilisation et de refactoriser le code de ces classes en les rendant plus haut niveau et l'ajout de comportement. En effet, l'un des avantages à aller dans cette voie, c'est que son beaucoup plus facile d'ajouter de nouveaux champs où est l'anonyme structure de données (comme dans FP langues), il devient beaucoup plus difficile pour ajouter un champ (vous finissez par la modification d'une tonne de code).
Il est à noter que, pour les 2-uplets certaines personnes utilisent (ou l'abus)
java.util.Map.Entry
comme il y a unjava.util.AbstractMap.SimpleEntry
dans la version 6 de Java. Aussi Certaines personnes utilisent maintenant Communes Lang3 Paire de support (2-n-uplet).Scala a n-tuple de soutien en sorte de tricherie et d'avoir tout un tas de 2-16 tuple interfaces qui sont la norme dans la langue et la syntaxe est cachée au programmeur.
À des fins purement éducatives raisons pour lesquelles vous voudrez peut-être voir comment d'autres langues accomplir cette.
Mise à JOUR: pour Java 8
Java 8/peut-être (heres mon numéro... appelez-moi peut-être) de support d'une interface appelée
java.lang.BiValue
avec une mise en œuvre concrète que vous pouvez utiliser appeléejava.lang.BiVal
. Ces classes sont pour aider à soutenir la nouvelle lambda fonctionnalité. Mais remarquez que ce n'est que pour 2-tuples.Mise à JOUR: pour 2015
Java 8 ne pas obtenir le soutien de n-uplets.
Mise à JOUR: à partir d'auteur 2015
Si vous préférez tuple de soutien il y a trois bibliothèques qui prennent en charge les tuples bien:
final
+ constructeur) devrait résoudre ce problème.java.lang.BiValue
intégré dans Java 8, comme suggéré ci-dessus. Peut-être supprimer le mentionner.Méthodes de Java retour exactement zéro ou une valeur; que est le standard de java. Si vous avez besoin de plusieurs valeurs retournées, créer un objet avec les valeurs multiples et de le retourner.
void
est un type de retour en java, btw.Si vous voulez revenir deux objets que vous voulez généralement à renvoyer un seul objet qui encapsule les deux objets à la place.
Il y a beaucoup de hackish façons d'y parvenir, un seul moyen serait de retour d'un
Object[]
, mais alors vous avez indices de s'inquiéter, et de pointeur null vérifications, il est juste méchant. Une autre façon est de retourner unString
, mais alors vous avez à analyser, et il devient méchant.Je pense que la vraie question est pourquoi?
C'est là le hic - Si je devais travailler sur un projet avec vous, et j'ai vu ce type de comportement, j'avais le réécrire pour que vous puissiez voir comment elle doit être traitée. Si vous fournir un exemple de code, je vais le réécrire pour illustrer.
Écrire vos méthodes avec une seule responsabilité, s'ils ont besoin de retourner plus de données qu'ils ont la capacité, vous devriez probablement utiliser un objet, ou le diviser en plus petites méthodes.
Parce que le renvoi des multiples de la valeur à partir d'une méthode n'est pas une pratique recommandée ( en Java ).
Si vous avez besoin sans rapport avec les valeurs à partir d'une méthode que vous avez besoin d'un autre discbased comme un objet contenant ces valeurs. Si vous avez besoin de plusieurs instances de la même classe ( c'est à dire plusieurs Chaînes de ), vous devez retourner un tableau, ou d'un ensemble en fonction de vos besoins.
Retourner plusieurs valeurs dans d'autres langues ( Aller par exemple ) sont utilisés par exemple pour renvoyer un eror code, mais de Java a été conçu différemment à l'aide d'exceptions.
Il ya un nouveau style de motif disponible, et s'inscrit dans le "tout est asynchrone" la nature de ce que vous pourriez voir dans des langages tels que JavaScript.
Beaucoup de mon code ressemble à ça aujourd'hui 🙂
Pas de nouveaux objets pour créer et pas que de nombreuses classes supplémentaires depuis l'interface est un intérieur de classe de l'objet.
C'est ce qui rend Swift tellement génial. Le code peut ressembler à ceci:
Et depuis le seul argument est le bloc, même ceci:
Java doit travailler à faire de rappel laden code beaucoup plus facile à lire.