Folienset 15: Java Generics

Werbung
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
Herunterladen