Я предполагаю, что OP означает «Почему Java не поддерживает объекты с n-кортежами?».Python, Haskell, Lisp, ML и т. Д. Имеют гетерогенные возможности n-кортежей.Также часто способность явно возвращать несколько объектов в языке является синтаксическим сахаром (т. Е. В python возвращают 'a', 'b').
Причина, конечно, заключается в проектировании и согласованности языка.Java предпочитает быть очень явным и не любит анонимные структуры данных (хотя я хотел бы, чтобы у нас были анонимные замыкания).
Например, в Java нет способа сказать, что я хотел бы получить обратный вызов, который принимает параметры этого типа и возвращаетэтот.Некоторые люди чувствуют эту огромную слабость, другие как последовательность и ясность.
ИМХО, хотя это раздражает, я часто борюсь с этой проблемой, делая статические встроенные классы:
private static class Combo {
String name;
int weight;
}
Да, это утомительно, но потомЯ часто использую и реорганизую эти классы, делая их на высшем уровне и добавляя поведение.Фактически, одним из преимуществ использования этого маршрута является то, что гораздо проще добавлять новые поля, где есть анонимная структура данных (как в языках FP), и добавлять поле становится намного сложнее (в итоге вы меняете тонну кода).
Следует отметить, что для двух кортежей некоторые люди используют (или злоупотребляют) java.util.Map.Entry
, поскольку в Java 6 java.util.AbstractMap.SimpleEntry
. Также некоторые люди теперь используют Поддержка пар Commons Lang3 (2-кортеж) .
Scala имеет поддержку n-кортежей в виде мошенничества и имеет целую связку из 2-16 интерфейсов кортежей, которые являются стандартными в языке и синтаксически скрыты от программиста.
По чисто образовательным причинам вы можете захотеть посмотреть, как другие языки выполняют это .
ОБНОВЛЕНИЕ: для Java 8
Java 8 будет / возможно (так вот мой номер ... позвоните мне, может быть) поддерживает интерфейс под названием java.lang.BiValue
с конкретной реализацией, которую вы можете использовать, под названием java.lang.BiVal
.Эти классы предназначены для поддержки новой функциональности лямбды.Но обратите внимание, что это только для 2-х кортежей.
ОБНОВЛЕНИЕ: для 2015 года
Java 8 не получила поддержку для кортежей.
ОБНОВЛЕНИЕ: от автора 2015
Если вам все еще нужна поддержка кортежей, есть три библиотеки, которые хорошо поддерживают кортежи:
- javatuples - поддерживает JDK 5 и выше.До 10-ти кортежей.
- JOOλ - от автора jOOQ, но требует JDK 8.
- Commons Lang 3 - теперь поддерживает Triple(3 кортежа) и поддерживает JDK 6 и выше.