Retrofitting


... [ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ...

Retrofitting bezeichnet das Anpassen vorhandener Klassen an die parametrisierte Form. Wenn man genau darüber nachdenkt, wird einem schon früh klar, dass die bisher beschriebenen Eigenschaften eigentlich nur dann umzusetzen sind, wenn alle Sourcefiles auf einmal compiliert werden. Werden nur einzelne Files compiliert, stellt sich die Frage wo die Typinformation bleibt, die ja aus den Sourcen gelöscht wird, aber für die Prüfung der korrekten Verwendung in anderen Klassen benötigt wird.

Die Lösung ist ganz einfach: sie wird in speziellen Signatur-Attributen im class-File abgelegt. Diese Daten werden von alten Compilern und von der JVM ignoriert [Lindholm99], §4.7.1. Ein Compiler der über Generizität verfügt, kann diese Information aber auswerten um die korrekte Anwendung von Typen zu überprüfen. UncheckedWarnings werden dann nicht mehr ausgelöst.

GJ Code der eine typparametrisierte Bibliothek benutzt, kann auch mit einer unparametrisierten Fassung (also einer älteren Fassung der Bibliothek arbeiten). Konkret bedeutet das, dass ein Programm unter Java 1.5 mit LinkedList<String> kompiliert werden kann und dieses Programm auch unter Java 1.4 mit einer alten Bibliothek wie erwartet funktionieren wird. Um vorhanden Bibliotheken (es ist kein Sourcecode erforderlich!) die Typsignaturen hinzuzufügen hat der GJ-Compiler einen speziellen Retrofitting-Modus. Dabei wird die alte Klasse angegeben, die ohne Generizität arbeitet, und ein Sourcecodefile, dass nur die Klassendeklaration, eventuelle Attribute und die Methodensignaturen enthält. Der Sourcecode wird also ohne Implementierungen geschrieben. Ein Beispiel:

01 class LinkedList<A> implements Collection<A> {
02   public LinkedList ();
03   public void add (A elt);
04   public Iterator<A> iterator ();
05 }
Bsp/Bsp29.txt

Codebeispiel 48


Dieses Quellcodefile (das natürlich keinen gültigen Javacode darstellt), wird mit der zu ändernden Klasse und zusätzlichen Parametern in den Compiler gesteckt. Dieser erzeugt eine neue Version der Klasse, die über die nötige Typsignatur verfügt. Jetzt kann diese Version der Klasse verwendet werden, ohne dass uncheckedWarnungen ausgelöst werden. Alle betroffenen Bibliotheksfunktionen (das Collection Paket) wurden auf diese Weise "Generizitätsfähig" gemacht. Keine Code musste dafür umgeschrieben werden.


... [ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ nach oben ] ...

valid html4 logo Code generated with AusarbeitungGenerator Version 1.1, weblink