15 Stimmen

Tuple (unveränderliche geordnete Liste von heterogenen Elementen) Unterstützung in Java

Ich frage mich, warum Java keine Implementierung von Tupel-Datenstrukturen in seiner Standardbibliothek hat. Zum Beispiel hat C++ eine sehr gute Implementierung dieser fixierten Sammlung heterogener Werte. Das Gleiche gilt für Haskell. In Java kenne ich nur javatuples und einige Unterstützung in der Functional Java-Bibliothek über Product (P1 - P8) Typen. Ich frage mich, warum tuple oder zumindest pair überhaupt nicht in der Standardbibliothek enthalten sind? Sogar die Android SDK-Entwickler haben ihre eigene Implementierung von 2-Tupeln (Pairs) hinzugefügt.

12voto

yshavit Punkte 41077

Der "Java-Weg" besteht darin, nutzerspezifische Klassen zu definieren, anstatt diese Arten von leichten halbklassenähnlichen Typen zu verwenden. Wenn man darüber nachdenkt, ist ein Tupel eigentlich nur eine vereinfachte Struktur; die Java-Entwickler würden es bevorzugen, dass du die Struktur einfach erstellst.

Diese Perspektive ändert sich ein wenig, insbesondere in Java 8 mit seinen Lambdas (die den JDK unter Druck setzen, generische Function-Typ-Schnittstellen bereitzustellen, anstatt einsatzspezifische Schnittstellen wie FooCallback zu verwenden). Aber es ist immer noch eine ziemlich starke Denkweise für viele Java-Entwickler, und es macht Sinn. Java ist eine sehr stark typisierte Sprache; ein Tupel liegt irgendwo zwischen statischer und dynamischer Typisierung, da im Typsystem nichts vorhanden ist, um dich davon abzuhalten zu denken, dass dieses (int, String), das eine Kunden-ID und Name darstellt, tatsächlich ein (int, String) repräsentiert, das eine Auftrags-ID und dessen Beschreibung darstellt.

Siehe dazu beispielsweise diese Diskussion ("Tupel für n >= 2") zum Thema innerhalb des Guava-Projekts. Zugegeben, das ist nicht offiziell; aber es ist eine gute Darstellung der Java-Denkweise.

9voto

Display Name Punkte 7774

Es gibt eine schöne Bibliothek namens javatuples. Es definiert generische Tupeltypen für Aritäten von 1 (Unit) bis 10 (Decade) und alle wesentlichen Methoden wie equals, hashCode, toString und sogar compareTo.

Offizielle Website: http://www.javatuples.org/
Maven-Abhängigkeit:

    org.javatuples
    javatuples
    [version]
    compile

(derzeit ist die neueste Version 1.2)

4voto

Adam Arold Punkte 27672

Es hat:

Collections.unmodifiableList(deineListe)

wird die Arbeit erledigen.

Ich denke, dass die Vielseitigkeit des JCF das Vorhandensein expliziter Tupel-Datentypen unnötig macht.

Ich nehme an, dass mit <em>Tupel</em> eine geordnete unveränderliche Liste von Elementen gemeint ist (gemäß der <a href="http://en.wikipedia.org/wiki/Tuple" rel="nofollow noreferrer">Wikipedia-Definition</a>).

Was die Bibliothek von Drittanbietern betrifft, hat meine Suche mit Google dies, dies und natürlich dies ergeben.

2voto

Peter Verhas Punkte 178

Es gibt einen Typ in der Java Laufzeit und er heißt Entry. Dies ist eine Schnittstelle innerhalb von Map und es gibt einfache Implementierungen davon innerhalb von AbstractMap.

http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html

http://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html

Sie können es als Tupel für zwei Elemente verwenden, Sie können sogar Generics anwenden. Ich würde hart nachdenken, was ich falsch gemacht habe, wenn ich jemals mehr als zwei Elemente benötigen würde. Wahrscheinlich lohnt es sich dann, eine eigene Klasse zu erstellen.

1voto

Thorn G Punkte 12300

Ein Kollege und ich haben das vor ein paar Wochen diskutiert. Die einzige Lösung, die mir eingefallen ist, war, die Werte intern in einer Map zu speichern und eine Methode zum Abrufen zu haben getValue(Class). Andernfalls, wie greifen Sie auf die Werte in Ihrem Tupel zu? Sie können keine generische Tuple-Klasse mit Methoden für jedes Mitglied haben, z. B. getInteger, getString, etc., da diese Methoden bis zum Zeitpunkt der Ausführung nicht bekannt wären, wenn Sie das Tupel erstellen. Dies bedeutet auch, dass Sie nie zwei Mitglieder mit demselben Typ haben könnten - wie würden Sie eine solche Klasse schreiben, damit sie zur Laufzeit wüsste, welches Objekt sie abrufen soll?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X