Generizität und Java
Übersicht: Generizität und Java
Ist Generizität schlecht?
Generizität für Java stößt bei vielen Programmierern auf Ablehnung. Der Grund ist C++. Die Art, wie Generizität in C++ mit dem Template-Mechnismus umgesetzt wird, ist berüchtigt für zahlreiche negative Eigenschaften. Sun hat sich für eine einfache Form von Generizität entschieden, die nicht die Komplexität von Templates und damit auch keine große Hürde für Anfänger darstellt. Trotzdem ist Generizität in Java ein beliebtes Streit-Thema in den Internetforen [
SunForum02]. Hier verwickeln sich die Gegner, die eine einfache Sprache behalten wollen und die Befürworter, die die zusätzliche Ausdruckskraft haben wollen, regelmäßig in lange Streitgespräche. In den Java Newsgroups sieht es nicht anders aus, wenn das Thema erst einmal angesprochen wurde. Trotzdem: auf der Liste der am meisten nachgefragten Features für Java steht Generizität auf Platz 1 [
SunRFE].
In der aktuellen Java Version 1.4.1 ist dieses Konzept nicht implementiert. Seit Bestehen der ersten Version von Java wird aber darüber diskutiert. Welche Probleme speziell bei Java zu beachten sind, wird im folgenden Kapitel besprochen.
Anforderungen an Generizität in Java
Java hatte mehrere primäre Designziele [
Gosling95], von denen die folgenden durch Generizität beeinflusst werden:
- Einfachheit
- Robustheit
- Sicherheit
- Geschwindigkeit
Die nachträgliche Erweiterung von Java um Generizität ist eine kritische Angelegenheit. Dies gilt natürlich für jede Programmiersprache. Bei Java kommt aber noch hinzu, dass die Änderungen an der Sprache möglichst wenig Einfluss auf die JVM, die "Java Virtual Machine" haben sollten. Eine JVM auf einem Desktop-PC aufzurüsten ist kein großes Problem. In einem Handy oder PDA eine neue JVM einzubauen, die möglicherweise mehr Hardware-Leistung und Speicher benötigt, kann dagegen zu einem großen Problem werden. Da Java auch wegen seiner Plattformunabhängigkeit als bevorzugte Sprache im Internet eingesetzt wird, ist dem Sicherheitsmodell besondere Beachtung zu schenken. Tatsächlich gibt es die Möglichkeit dieses mit Generizität zu umgehen, wenn der Entwickler nicht entsprechende Vorsichtsmaßnahmen trifft, wie ein Beispiel zeigen wird.
Entwürfe
Es gab in den letzten Jahren viele Entwürfe, wie Java um Generizität erweitert werden könnte. Einige davon wurden auch als Prototypen implementiert. Der bedeutenste Entwurf war GJ ("generic Java"), der im wesentlichen als Konzept für Java 1.5 übernommen wird. Java 1.5. ist jetzt für Mitte 2003 geplant und wird Generizität enthalten [
Bracha01_2]. Diese Arbeit stellt allgemeine Eigenschaften von Generizität in Programmiersprachen vor und bespricht das vermutlich endgültige Konzept für Java 1.5 inklusive der Vor- und Nachteile der Implementierung. Der leitende Entwickler hat mir bestätigt, dass es in den "nächsten Monaten" eine überarbeitete Fassung der Spezifikation geben wird [
BrachaMail]. Codebeispiele, die mit dem Prototypcompiler getestet wurden, sollen die Möglichkeiten und Grenzen aufzeigen. Es erfolgt ein kurzer Vergleich mit anderen Vorschlägen und der Umsetzung in anderen Programmiersprachen, speziell C++. Daneben wird kurz die Implementierung von Generizität in Haskell und der Entwurf für CLR [
Kennedy02] von Microsoft angesprochen. Ein vollständiger Vergleich würde aber über den Rahmen dieses Seminars hinaus gehen.
Es folgt eine Übersicht, über die Vorschläge für Generizität in Java:
- "PolyJ" [Bank96]
- "Pizza" [Odersky97]
- "Adding Type Parameterization to the Java Language" [Agesen97]
- "Virtual Types" [Thorup97]
- "GJ" [Bracha98]
- "NextGen" [Cartwright98] (eine Art GJ mit Runtime-Typinformation - vielleicht für Java 1.6?)
- "Combining parameterized and virtual types" [Bruce98]
- "Structural virtual types" [Thorup99]
- "Adding Generics to Java" [Bracha01_1] - die offizielle Spezifikation von Sun basierend auf GJ
GJ und die jsr14 Spezifikation
GJ ist aus dem Pizza Projekt entstanden, dass Java um einige Konzepte aus funktionalen Programmiersprachen erweitert hat. Unter anderem wurden in Pizza Funktionen erster Ordnung unterstützt (die als Parameter übergeben werden können), Klassen und Methoden konnten mit Typen parametrisiert werden und die Sprache wurde um algebraische Datenstrukturen erweitert. GJ hat von diesen Konzepten nur die Typgenerizität übernommen und abgewandelt. Pizza wird inzwischen nicht mehr weiterentwickelt.
Bei Sun existiert schon länger eine JSR - JavaSpecificationRequest für Generizität in Java. Diese hat die Nummer 14 und wird jsr14 genannt. Basierend auf GJ (es wurden nur kleine Änderungen vorgenommen) hat Sun im August 2001 eine "Participant Draft Specification" [
Bracha01_1] herausgegeben. Der aktuelle Status ist "Recently Closed Public Review". Es existiert auch ein Prototypcompiler [
Prototyp01], der jedoch noch eine Reihe von Bugs enthält [
Bug02]. Die Suche in der Bugdatabase nach "generic" in Verbindung mit "prototype" liefert 1360 Dokumente, von denen viele echte Bugs beschreiben! Der Prototypcompiler besteht aus ca. 20.000 Zeilen Code, die selbst in GJ geschrieben wurden.
Die Implementierung von Generizität in Java lässt sich in wenigen Sätzen zusammenfassen:
Es ist eine Erweiterung um generische, optional beschränkte Typen, die auch wechselseitig rekursiv sein können, sowie um polymorphe Methoden. Die Übersetzung geschieht homogen mit Brückenmethoden und Typersetzung ohne generische Laufzeitinformation. Sie ist durch raw Types rückwartskompatibel und durch Retrofitting vorwärtskompatibel. Methodenüberschreibung ist für Rückgabeparameter covariant, die Ableitung von parametrisierten Typen ist invariant. Die Typ-Inferenz ist lokal.
Damit der normale Mensch hiermit auch etwas anfangen kann, folgen nun einige Erklärungen dazu. Die Erklärungen und Codebeispiele wurden größtenteils aus [
Bracha01_1], [
Bracha98_2] und [
Bracha98] übernommen. Wenn im folgenden von GJ gesprochen wird, ist damit meistens gleichbedeutend die Spezifikation von Sun gemeint, die wohl letztendlich implementiert wird. Die Unterschiede zwischen den Spezifikationen werden gesondert angesprochen.
Code generated with AusarbeitungGenerator Version 1.1, weblink