54 votes

Renvoyer plusieurs valeurs à partir d'une méthode Java : pourquoi pas d'objets n-tuple ?

Pourquoi n'existe-t-il pas une solution (standard, certifiée par Java), faisant partie du langage Java lui-même, pour renvoyer plusieurs valeurs à partir d'une méthode Java, au lieu que les développeurs doivent utiliser leurs propres moyens, comme les cartes, les listes, les paires, etc. Pourquoi Java ne prend-il pas en charge les objets n-tuple ?

On pense en particulier aux méthodes privées triviales qui peuvent modifier deux objets ensemble (en tandem), et dans ce cas un objet typé comme retour semble exagéré.

61voto

Adam Gent Points 15055

Je suppose que le PO veut dire "Pourquoi Java ne prend pas en charge les objets n-tuple ? Python, Haskell, Lisp, ML etc. ont des capacités n-tuple hétérogènes. De plus, la possibilité de renvoyer apparemment plusieurs objets dans un langage est souvent un sucre syntaxique (par exemple, en Python, return 'a', 'b').

La raison en est bien sûr la conception et la cohérence de la langue. Java préfère être très explicite et n'aime pas les structures de données anonymes (même si j'aimerais que nous ayons des fermetures anonymes).

Par exemple, en Java, il n'y a aucun moyen de dire que je voudrais un callback qui prenne ces paramètres de type et renvoie ceci. Certaines personnes considèrent qu'il s'agit d'une énorme faiblesse, d'autres apprécient la cohérence et le caractère explicite.

À mon avis, bien que ce soit ennuyeux, je lutte souvent contre ce problème en créant des classes statiques en ligne :

private static class Combo {
   String name;
   int weight;
}

Oui, c'est fastidieux, mais plus tard, je réutilise et remanie souvent ces classes en les rendant de haut niveau et en ajoutant du comportement. En fait, l'un des avantages de cette méthode est qu'il est beaucoup plus facile d'ajouter de nouveaux champs, alors qu'avec une structure de données anonymes (comme dans les langages FP), il est beaucoup plus difficile d'ajouter un champ (on finit par changer une tonne de code).

Je dois noter que pour les 2-tuples, certaines personnes utilisent (ou abusent de) java.util.Map.Entry car il existe un java.util.AbstractMap.SimpleEntry en Java 6. De plus, certaines personnes utilisent maintenant Support de la paire de Commons Lang3 (2-tuple) .

Scala prend en charge les n-uplets en trichant en quelque sorte et en disposant de toute une série d'interfaces de 2 à 16 tuplets qui sont standard dans le langage et sont syntaxiquement cachées au programmeur.

Pour des raisons purement pédagogiques, vous voudrez peut-être voir comment les autres les langues y parviennent .

MISE À JOUR : pour Java 8

Java 8 va/peut être (voici mon numéro... appelez-moi peut-être) supporter une interface appelée java.lang.BiValue avec une implémentation concrète que vous pouvez utiliser appelée java.lang.BiVal . Ces classes sont destinées à aider à supporter la nouvelle fonctionnalité lambda. Mais remarquez que c'est seulement pour les 2-tuples.

MISE À JOUR : pour 2015

Java 8 a fait no obtenir le support des tuples.

MISE À JOUR : de l'auteur 2015

Si vous souhaitez toujours avoir le support des tuples, il existe trois bibliothèques qui le font bien :

  • javatuples - Prend en charge JDK 5 et plus. Jusqu'à 10 tuple.
  • JOOλ - De l'auteur de jOOQ mais nécessite JDK 8.
  • Commons Lang 3 - Supporte maintenant un triple (3-tuple) et supporte JDK 6 et plus.

10voto

DwB Points 14687

Les méthodes Java renvoient exactement zéro ou une valeur ; c'est-à-dire que est la norme pour java. Si vous avez besoin de renvoyer plusieurs valeurs, créez un objet avec les valeurs multiples et renvoyez-le.

6voto

Psychologist Points 69

Si vous souhaitez renvoyer deux objets, il est généralement préférable de renvoyer un objet unique qui encapsule les deux objets.

5voto

Travis Points 1664

Il existe de nombreux moyens détournés d'accomplir cela, l'un d'entre eux serait de renvoyer un message de type Object[] mais ensuite, il faut se préoccuper des indices et des vérifications des pointeurs nuls, ce qui devient désagréable. Une autre solution consiste à renvoyer un String mais ensuite il faut l'analyser, et ça devient désagréable.

Je pense que la vraie question est pourquoi ?

Voilà le hic : si je travaillais sur un projet avec vous et que je voyais ce type de comportement, je le réécrirais pour que vous puissiez voir comment le gérer. Si vous fournissez un échantillon de code, je le réécrirai pour l'illustrer.

Écrivez vos méthodes avec une seule responsabilité. Si elles doivent renvoyer plus de données qu'elles n'en ont la capacité, vous devriez probablement soit utiliser un objet, soit le diviser en plusieurs méthodes plus petites.

2voto

OscarRyz Points 82553

Parce que renvoyer plusieurs valeurs à partir d'une méthode n'est pas une pratique recommandée (en Java).

Si vous avez besoin de valeurs non liées à une méthode, vous avez besoin d'une structure de données différente, comme un objet contenant ces valeurs. Si vous avez besoin de plusieurs instances de la même classe (par exemple, plusieurs chaînes de caractères), vous devez retourner un tableau ou une collection, selon vos besoins.

Le renvoi de valeurs multiples dans d'autres langages (Go par exemple) est utilisé pour renvoyer un code d'erreur, mais Java a été conçu différemment en utilisant des exceptions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X