Vorlesung Programmieren 15 Java API 02.02.2015 | Prof. Dr. Ralf H. Reussner LEHRSTUHL FÜR SOFTWARE-DESIGN UND –QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), FAKULTÄT FÜR INFORMATIK KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft Version 1.0 sdq.ipd.kit.edu www.kit.edu Organisatorisches: Programmieren SS 2015 Programmieren-Vorlesung findet nächstes Semester nicht statt Tutorien finden nächstes Semester auch nicht statt Der Übungsschein kann trotzdem erworben werden 6 Übungsblätter 50 % der Gesamtpunkte zum Erwerb des Scheines 2 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Literaturhinweis - Weiterlesen Dietmar Ratz, Jens Scheffler, Detlef Seese und Jan Wiesenberger „Grundkurs Programmieren in Java“, 7. Auflage, 2014 (mit Java 8), Hansa-Verlag Kapitel 12 „Einige wichtige Hilfsklassen“ Anhang C „Umgang mit der API-Spezifikation“ 3 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Java API API: Application Programming Interface Sammlung von Klassen / Paketen für häufig benötigte Funktionalität „Das Rad nicht immer wieder neu erfinden.“ Erlaubt Java-Programmierung auf höherer Ebene Klassen, die Sie bereits kennen: Object, String, Math, Enum, Comparable, Wrapper-Klassen, ... Beschreibung / Dokumentation unter http://docs.oracle.com/javase/7/docs/api/ Wichtige Pakete: java.lang: Basisfunktionalität (Object, String, Math, Enum, ...) java.util: Java Collections Framework / Zeit- und Datumsfunktionen, ... java.io: Ein- und Ausgabe 4 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Java API 5 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Das Java Collections Framework Collection = Sammlung von Objekten Java Collection Framework: Einheitliche Architektur zur Repräsentation und Manipulation von Collections Abstraktion von der Implementierung Verringerung des Programmieraufwands 14 generische Interfaces mit jeweils mehreren Implementierungen Hauptinterfaces: Collections Set List Map Queue SortedMap SortedSet 6 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Das Interface Collection<E> Alle Collection-Interfaces sind generisch: public interface Collection<E> { ... } Collection<E> trifft keine Aussage darüber, ob die Elemente der Collection geordnet sind die Collection Duplikate enthält Collection<E> wird verwendet, wenn möglichst wenig Einschränkungen gelten sollen bzw. bekannt sind. Set, List und Queue sind spezifischere Collections 7 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Das Interface Collection<E> Collection<E> definiert folgende Methoden: public interface Collection<E> extends Iterable<E> { int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator<E> iterator(); boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); void clear(); Object[] toArray(); <T> T[] toArray(T[] a); } 8 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Exkurs: Wildcards in generischen Typen In generische Typen kann als Typ-Parameter auch „?“ verwendet werden Bsp.: Collection<?> c „unbounded wildcard“ Das „?“ steht für einen beliebigen, aber festen Typ Über den Typ „?“ dürfen keine Annahmen gemacht werden Es gibt drei Arten von Wildcards in generischen Typen: <?> <?<? super [T]> super Animal> <?<? extends [T]> extends Animal> class Object is-a class LivingOrganism is-a class Animal is-a class Mammal is-a class Dog 9 02.02.2015 Vorlesung Programmieren: Java API is-a class Plant is-a class Bird is-a class Cat Lehrstuhl für Software-Design und –Qualität (SDQ) 9 Institut für Programmstrukturen und Datenorganisation (IPD) Exkurs: Kovarianz / Invarianz Kovarianz und Invarianz beschreiben die Vererbungsrichtung z.B. bei ContainerKlassen Arrays in Java: kovariant Integer Unterklasse von Number ➜ Integer[] Unterklasse von Number[] Beispiel: Number[] a = new Integer[1]; a[0] = new Integer(4); // ok Generics in Java: invariant keine Ableitungsbeziehung zwischen z.B. ArrayList<Number> und ArrayList<Integer> Beispiel: ArrayList<Number> a = new ArrayList<Integer>(); // Kompilierfehler Mit „Bounded Wildcards“: List<? extends Number> b = new ArrayList<Integer>();// ok b.add(new Integer(42)); // Kompilierfehler 10 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Exkurs: Wildcards mit generischen Typen Richtlinien zur Verwendung von Wildcards: „bounded wildcards“ (List<? extends T>) kann man sich grob als „read only“-Typ vorstellen (keine Modifikationen z.B. mit add möglich) List<?> vs. List<Object>: List<?>: homogene Liste von Elementen (gleicher, aber unbekannter Typ) List<Object>: heterogene Liste (unterschiedliche Elementtypen möglich) Beispiel: List<Object> ol = new ArrayList<Object>(); ol.add(new Integer(42)); List<?> wl = new ArrayList<Integer>(); wl.add(new Integer(42)); 11 02.02.2015 Vorlesung Programmieren: Java API // ok // Kompilierfehler Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Nochmals: Das Interface Collection<E> Collection<E> definiert folgende Methoden: public interface Collection<E> extends Iterable<E> { int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator<E> iterator(); boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); void clear(); Object[] toArray(); <T> T[] toArray(T[] a); } 12 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Sub-Interfaces von Collection<E> List<E> geordnete Collection; kann Duplikate enthalten; Zugriff auf Elemente mittels Index Implementierungen: ArrayList, LinkedList Set<E> keine Duplikate; modelliert mathematische Menge Implementierungen: HashSet, TreeSet SortedSet<E> keine Duplikate; aufsteigend sortiert Implementierungen: TreeSet 13 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Das Interface Map<K,V> Modelliert eine mathematische Funktion von K nach V K: Schlüssel, V: Werte Auf Grund Funktionseingeschaft: Eine Map enthält keinen Schlüssel mehrmals Jeder Schlüssel bildet auf höchstens einen Wert ab public interface Map<K,V> { V put(K key, V value); V get(Object key); V remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); void putAll(Map<? extends K, ? extends V> m); void clear(); public Set<K> keySet(); public Collection<V> values(); } 14 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Map<K,V>: Beispiel Map<K,V> unter anderem Implementiert von TreeMap<K,V> Beispiel: Map<String,Integer> mountains = new TreeMap<String,Integer>(); mountains.put(„Mount Everest“, 8848); mountains.put(„K2“, 8611); mountains.put(„Lhotse“, 8516); System.out.println(mountains.containsKey(„Lhotse“)); // Ausgabe: true System.out.pritnln(mountains.get(„K2“)); // Ausgabe: 8611 System.out.println(mountains.get(„Zugspitze“)); // Ausgabe: null berge.remove(„K2“); System.out.println(mountains.size()); // Ausgabe: 2 System.out.println(mountains.values()); // Ausgabe: [8848, 8516] 15 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Die Klasse Collections Die Klasse Collections enthält statische Methoden zum Umgang mit einer Collection: public static boolean disjoint(Collection<?> c1, Collection<?> c2) // true, falls kein Element sowohl in c1 als auch in c2 enthalten ist public static int frequency(Collection<?> c, Object o) // Anzahl der Elemente in c, die gemäß equals identisch zu o sind public static void reverse(List<?> l) // Kehrt die Reihenfolge der Elemente in l um public static <T> boolean replaceAll(List<T> l, T oldV, T newV) // Ersetzt jedes zu oldV identische Element in l durch newV public static <T extends Comparable<? super T>> void sort(List<T> l) // Sortiert l gemäß der Methode compareTo des Typs T public static <T> void sort(List<T> list, Comparator<? super T> c) // Sortiert l gemäß Comparator c 16 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Das Paket java.io java.io enthält Klassen zur Ein- und Ausgabe durch Datenströme und Dateien Die wichtigsten Klassen zur Ein- und Ausgabe sind: Byte-basiert (byte streams): InputStream und OutputStream FileInputStream und FileOutputStream Zeichen-basiert (character streams): Reader und Writer InputStreamReader und OutputStreamWriter FileReader und FileWriter Mit Puffer (Zwischenspeicher): BufferedInputStream und BufferedOutputStream BufferedReader und BufferedWriter 17 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Ein- und Ausgabe in Java Beispiel 1: Lesen von Zeichen der Standardeingabe in einen String String s = new String(); InputStreamReader isr = new InputStreamReader(System.in); int c = isr.read(); while (c != -1) { s += (char) c; c = isr.read(); } Beispiel 2: Schreiben von Zeichen eines Strings auf die Standardausgabe OutputStreamWriter osw = new OutputStreamWriter(System.out); for (int i = 0; i < s.length(); i++) { osw.write(s.charAt(i)); } osr.flush(); 18 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Ein- und Ausgabe in Java Die Klassen in java.io realisieren das Design Pattern Decorator: Erlaubt, zusätzliche Funktionalität zur Laufzeit zu einzelnen Objekten hinzuzufügen Beispiel: OutputStream os = new FileOutputStream(„file.txt“); // Byte-weises schreiben in Datei OutputStream bos = new BufferedOutputStream(os); // ...mit Ausgabepuffer OutputStream dbos = new DeflaterOutputStream(bos); // ...und mit Kompression der Ausgabe (ZIP) 19 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Java Puzzlers Joshua Bloch, Neal Gafter: Java Puzzlers Video: Java Puzzlers URL: https://www.youtube.com/watch?v=V1vQf4qyMXg 20 02.02.2015 Vorlesung Programmieren: Java API Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD)