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.