Algorithmen und Datenstrukturen II Alexander Goesmann Bioinformatics Resource Facility Center for Biotechnology Universität Bielefeld Vorlesung Sommer 2010 Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Was heißt „generic“? In Java: Abstraktion über Typen © Pons Wörterbuch - www.pons.de Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Einsatz von Generics Beispiel Container Typen: List liste = new ArrayList(); liste.add(new Double(0)); Double zahl = (Double) liste.get(0); List<Double> liste = new ArrayList<Double>(); liste.add(new Double(0)); Double zahl = liste.get(0); Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wozu Generics? Generics helfen Fehler zu vermeiden Typsicherheit verhindert Laufzeitfehler Fehler werden bereits beim Kompilieren entdeckt Beispiel – Liste von Zahlen: List liste = new ArrayList(); liste.add(new Double(0)); Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wozu Generics? Angenommen, später im Programm fügen wir unserer Liste von Zahlen (!) ein weiteres Element hinzu: liste.add(„20“); // Achtung String! Zugriff auf alle Elemente der Liste … for (int i=0; i<liste.size(); i++) { Double zahl = (Double) liste.get(i); } … resultiert leider in einer Runtime-Exception: Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wozu Generics? Besser: Definition der Liste als Liste vom Typ Double List<Double> liste = new ArrayList<Double>(); liste.add(new Double(0)); Fehlermeldung bereits beim Kompilieren, also vor Ausführung des Programms liste.add(„10“); // FEHLER !!! Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Collections Framework => Beispiele im Java API Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wie funktionieren Generics? Beispiel: Eine „generische“ Box public class Box<T> { private T t; // T = formaler Typparameter public void add(T t) { this.t = t; } public T get() { return t; } } Instanzierung und Benutzung: Box<Integer> meineBox = new Box<Integer>(); Integer x = meineBox.get(); // kein Cast notwendig! Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Typ-Variablen != Typen Wichtig: Typ-Variablen sind keine echten Typen Es gibt keine Klassen und Dateien, wie z.B. T.java oder T.class Alle generischen Informationen werden beim Kompilieren vollständig entfernt Auch möglich: Mehrere Typ Parameter z.B. public class Box<T,U> Aber Achtung! Nicht public class Box<T,T> Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Namensgebung und Konventionen E – Element (wird vom Java Collections Framework benutzt) K – Key N – Number T – Type V – Value S,U,V – zweiter, dritter, vierter Typ usw. Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Generische Methoden und Konstruktoren public class Box<T> { private T t; // T = formaler Typparameter public <U> void pruefe(U u) { if (t.getClass().getName().equals(u.getClass().getName())) { return(true); } else { return(false); } } } public void add(T t) { this.t = t; } … // Hauptprogramm: Box<Double> double = new Box<Double>(); box.add(2.0); System.out.println(box.pruefe(„EINUNDZWANZIG“)); Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Bounded Type Parameters public class Box<T extends Number> { private T t; // T = formaler Typparameter public void add(T t) { this.t = t; } } public T get() { return t; } // Hauptprogramm: Box<Double> box = new Box<Double>(); box.add(2.0); box.add(„EINUNDZWANZIG“) // Kompilierfehler! Und was ist mit Box<String> box2 … ? Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Subtyping „is a“- relationship: Object beliebig = new Object(); Integer zahl = new Integer(10); beliebig = zahl; // OK, oder? Methoden: public void eineMethode(Number n) { // … } eineMethode(new Integer(10)); // OK, oder? eineMethode(new Double(99.3)); // OK, oder? Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Subtyping Generics: List<Number> liste = new Liste<Number>(); liste.add(new Integer(99)); liste.add(new Double(0.22)); // OK, oder? Welche Argumente akzeptiert die folgende Methode? public void add(List<Number> liste) { // … } add(new ArrayList<Number>()); // OK, oder? add(new ArrayList<Double>()); // Immer noch OK? Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Subtyping Die Antwort ist: NEIN! ArrayList<Double> ist nicht vom Typ List<Number> Hint: Cage<E> extends Collection<E> © cobald123 http://www.flickr.com/ photos/cobalt/1462679117/ © terriem http://www.flickr.com/photos/terriem/3683049691/ Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wildcards Gibt es doch eine Lösung? public void add(List<Number> liste) { ... → Der Wildcard character „?“ public void add(List<? extends Number> liste) { // … } Dann geht auch: add(new ArrayList<Number>()); add(new ArrayList<Double>()); Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Zusammenfassung - Generics Generics helfen Fehler zu vermeiden Typsicherheit verhindert Laufzeitfehler Abstraktion über Typen Erzeugung neuer Datentypen die von zugrunde liegenden Typen abstrahieren: Beispiel Liste - Hinzufügen, Einfügen, Löschen usw. sind elementare Operationen, die bei jeder Liste gleich sind, egal ob der Inhalt vom Typ Double, String oder Object ist. Weitere Informationen: Java Tutorial über Generics: http://download.oracle.com/docs/cd/E17409_01/ javase/tutorial/java/generics/index.html Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Serialisierung Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Serialisierung • Java Mechanismus zum Speichern und Laden von Objekten • Speichert Objekte mit all ihren Abhängigkeiten (Objektgraph) • Schlankes API • Serializable Interface • ObjectInputStream • ObjectOutputStream Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Serialisierung • Ein Objekt ist serialisierbar, wenn es das Serializable-Interface implementiert • Alle Attribute müssen auch serialisierbar oder transient sein • Serializable enthält keine Methoden • Markierung für spezielle Handhabung durch JVM Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Welche Objekte sind serialisierbar? • Primitive • int • float • … • Objekte die das Serializable Interface implementieren • String • Swing Komponenten • … Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Welche Objekte nicht? Objekte bei denen nicht klar ist, wie sie serialisiert werden können: • Threads • Streams • Timer Nicht zu serialisierende Attribute werden mit dem transient Schlüsselwort markiert Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wie geht das? Serialisierbares Objekt, z.B. public class PersistentTime implements Serializable { private Date time; public PersistentTime(){ time = Calendar.getInstance().getTime(); } public Date getTime(){ return time; } } Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wie geht das? Speichern mit einem ObjectOutputStream PersistentTime time = new PersistentTime(); FileOutputStream fos = null; ObjectOutputStream out = null; try{ fos = new FileOutputStream(filename); out = new ObjectOutputStream(fos); out.writeObject(time); out.close(); }catch(Exception ex){…} Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Wie geht das? Laden mit einem ObjectInputStream PersistentTime time = null; FileInputStream fis = null; ObjectInputStream in = null; try{ fis = new FileInputStream(filename); in = new ObjectInputStream(fis); time = (PersistentTime)in.readObject(); in.close(); } catch(Exception ex){…} Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Anwendung • Ganze Programmteile speichern und wieder laden • Konfigurationen speichern/laden • Daten zwischen verschiedenen JVM Instanzen austauschen Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Pros/Cons Pro • Einfach • Große Objektgraphen können einfach gespeichert werden Contra • Nicht kompatibel zu anderen Programmiersprachen • Performanz Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Alternative: XML-Encoder • Speichert Objekthierarchien in XML Dateien • Funktioniert nur mit JavaBeans • Parameterloser public Konstruktor • Get- und set-Methoden für alle Attribute • java.beans.XMLEncoder • java.beans.XMLDecoder => mehr zu XML am Freitag! Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Properties javax.util.Properties Schlüssel-Wert Paare Speichern und Laden von Einstellungen • Konfigurationen • Internationalisierung Property-Dateien .properties Einfacher Austausch mit anderen Programmen Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Properties verwenden Setzen von Properties public Object setProperty(String key, String value) Lesen von Properties public String getProperty(String key) public String getProperty(String key, String default) Ausgabeformate: • Propertyliste • XML Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Preferences • Zum Speichern von Programmkonfigurationen • User-/System-Konfiguration • User für Benutzerspezifische Konfigurationen • System für Systemeinstellungen • Transparent zum Betriebssystem Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Preferences • Hierarchische Datenstruktur • Baum • Knoten haben Namen • Knoten enthalten Properties • Ähnlich einem Dateisystem • Absoluter Pfad • Relativer Pfad Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld Preferences • User Knoten abfragen • Preference.node(„/de/cebitec/gendb/regionviewer“); • Attribute setzen oder abfragen mit get und set Methoden • Änderungen werden automatisch gespeichert • Listener können registriert werden um Änderungsmitteilungen zu erhalten Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld ENDE! Alexander Goesmann A&D II, Vorlesung SS2010 Universität Bielefeld