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