mpfohlene Literatur 12) Generische Datenstrukturen http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf rof. Dr. rer. nat. habil. Uwe Aßmann Lehrstuhl Softwaretechnologie Fakultät für Informatik TU Dresden Version 09-0.2, 24.11.08 Softwaretechnologie, rof. Uwe Aßmann 1 rof. U. Aßmann, Softwaretechnologie 2 2 Trends in der Softwareentwicklung lemente einer Hierarchie Rapid Application Development (RAD) Schneller viel Code schreiben Typisierung weglassen Zeit pike Bei den Assoziationen Beim rogrammieren gegen Schnittstellen Mächtige Operationen, die schnell zu schreiben sind Java Java 1.5 Formular Safe Application Development (SAD) Guten Code schreiben Typisierung, damit der Übersetzer viele Fehler entdeckt (statische Typisierung) Mehr ntwurfswissen aus dem ntwurf in die Implementierung übertragen Typisierung der Assoziationen Zuverlässigkeit Aus der Definition einer Datenstruktur können Bedingungen für ihre Anwendung abgeleitet werden Bestellung Lieferschein Rechnung rof. U. Aßmann, Softwaretechnologie 3 rof. U. Aßmann, Softwaretechnologie 4
roblem 1 ungetypter Schnittstellen: Laufzeitfehler roblem 2 ungetypter Schnittstellen: Unnötige Casts Bei der Konstruktion von s werden oft Fehler programmiert, die bei der Dekonstruktion zu Laufzeitfehlern führen Bei der Dekonstruktion von s müssen unnötig Casts spezifiziert werden Kann in Java < 1.4 nicht durch den Übersetzer entdeckt werden Typisierte s erhöhen die Lesbarkeit, da sie mehr Information geben listofrechnung.add(best); rogrammierfehler! Rechnung rechnung2 = new Rechnung(); listofrechnung.add(rechnung2); Diesmal ok rechnung = (Rechnung)listOfRechnung.get(i); rechnung = (Rechnung)listOfRechnung.get(i); Laufzeitfehler!! rof. U. Aßmann, Softwaretechnologie 5 Cast nötig, obwohl alles Rechnungen rof. U. Aßmann, Softwaretechnologie 6 Abhilfe: Generische Klassen Generische Datentypen in der -Hierarchie ine generische Klasse ist eine Klassenschablone, die mit einem Typparameter versehen ist. Die neue, generische -Hierarchie (seit Java 1.5) : lement, K: Key, V: Value In UML In Java Sprachregelung: Container of Collectio n Container content class Container<> { content[]; Ma p rof. U. Aßmann, Softwaretechnologie 7 rof. U. Aßmann, Softwaretechnologie 8
Instanz der Generischen Hierarchie robleme gelöst Map Bei der Konstruktion von s werden jetzt Äpfel von Birnen unterschieden Casts sind nicht nötig, der Übersetzer kennt den feineren Typ <<instantiates>> <Rechnung> listofrechnung = new Array<Rechnung>(); listofrechnung.add(best); Compilerfehler Map <Nr,Formular> Darf man Rechnungen, Bestellungen und Lieferscheine in diese s stecken? Ja. rechnung = listofrechnung.get(i); <Nr,Formular> rof. U. Aßmann, Softwaretechnologie 9 Kein Cast mehr nötig rof. U. Aßmann, Softwaretechnologie 10 Generizität funktioniert auch geschachtelt Benutzung von getypten und ungetypten Schnittstellen.. ist in Java 1.5 ohne robleme nebeneinander möglich // Das Archiv fasst alle Rechnungen aller bisherigen Jahrgänge zusammen <<Rechnung>> archiv = new Array<<Rechnung>>(); // listofrechnung fasst die Rechnungen des aktuellen Jahres zusammen <Rechnung> listofrechnung = new Array<Rechnung>(); archiv.add(listofrechnung); archiv.getindex(0).add(rechnung); archiv.getindex(0).add(best); funktioniert for (int jahr = 0; jahr < archiv.size(); jahr++) { listofrechnung = archiv.getindex(jahr); rechnung = listofrechnung.getindex(i); Übersetzungs- Fehler // Das Archiv fasst alle Rechnungen aller bisherigen Jahrgänge zusammen <<Rechnung>> archiv = new Array<<Rechnung>>(); // listofrechnung fasst die Rechnungen des aktuellen Jahres zusammen archiv.add(listofrechnung); archiv.getindex(0).add(rechnung); archiv.getindex(0).add(best); for (int jahr = 0; jahr < archiv.size(); jahr++) { listofrechnung = archiv.getindex(jahr); funktioniert rechnung = (Rechnung)listOfRechnung.getIndex(i); Übersetzt auch, aber Laufzeitfehler beim Cast... rof. U. Aßmann, Softwaretechnologie 11 rof. U. Aßmann, Softwaretechnologie 12
Typschranken generischer arameter (type bounds) Generische Methoden als Funktionale Objekte Beispiel: Comparable<> als Return-typ in der s-klasse sichert zu, dass die Methode compareto() existiert in Funktionalobjekt ist ein Objekt, das eine Funktion darstellt (reifiziert). class s { /** minimum function for a. Return value is typed * with a generic type with a type bound */ public static < extends Comparable<>> min(<> ce) { Iterator<> iter = ce.iterator(); curmin = iter.next; if (curmin == null) return curmin; for ( element = curmin; iter.hasnext(), element = iter.next) { if (element.compareto(curmin) < 0) { curmin = element; return curmin; Funktionalobjekte können Berechnungen kapseln und später ausführen (laziness) (ntwurfsmuster Command) s gibt eine Funktion in der Klasse des Funktionalobjektes, dass die Berechnung ausführt Generischer Name, z.b. execute() oder doit() Zur Laufzeit kann man das Funktionalobjekt mit arametern versehen Herumreichen Und zum Schluss ausführen rof. U. Aßmann, Softwaretechnologie 13 rof. U. Aßmann, Softwaretechnologie 14 Generische Methoden als Funktionale Objekte Unterschiede zu C++ <> BinOp Functional Accumulate Anwendung: Akkumulatoren und andere generische enoperationen B C, // A functional object that adds, once invoked interface BinOp<> { execute( p1, p2); // An interface for a collection of binary operation on // collections interface Functional<<>,B extends BinOp<>> { compute(<> p); class Accumulate<C,> implements Functional<C,BinOp<>> { cursum; element; BinOp<> binaryoperation; public compute(c coll) { for (int i = 0; i < coll.size(); i++) { element = coll.getindex(i); cursum = binaryoperation.execute(cursum,element); return cursum; In Java: einmalige Übersetzung des generischen Datentyps Verliert etwas ffizienz, da der Übersetzer alle Typinformation im generierten Code vergisst und nicht ausnutzt z.b. sind alle Instanzen mit unboxed objects als boxed objects realisiert C++ bietet Code-Templates (snippets, fragments) an, mit denen man mehr parameterisieren kann, z.b. Methoden In C++ können Templateparameter Variablen umbenennen: template class C <class T> { T attribute<t> Templateparameter können Variablen umbenennen rof. U. Aßmann, Softwaretechnologie 15 rof. U. Aßmann, Softwaretechnologie 16
Was haben wir gelernt nd Generische Datenstrukturen sind Klassenschablonen mit Typ-arameter Feinere statische Typisierung möglich Generische s besitzen den lement-typ als Typ-arameter lement-typ verfeinert Object Weniger Casts, mehr Typsicherheit rof. U. Aßmann, Softwaretechnologie 17 rof. U. Aßmann, Softwaretechnologie 18