Vorlesung Programmieren

Werbung
Vorlesung Programmieren
12 Java API
13.01.2016 | Prof. Dr. Ralf H. Reussner
Version 1.0
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
sdq.ipd.kit.edu
www.kit.edu
Wichtige Termine
  Programmieren Übungsschein:
  Anmeldungszeitraum zwischen 01.10.2015 und 10.02.2016
  Programmieren Abschlussaufgaben:
  Anmeldungszeitraum zwischen 01.10.2015 und 24.02.2016
  Anmeldung jeweils über das „Campus Management Portal“:
https://campus.studium.kit.edu/
2
13.01.2016
Vorlesung Programmieren: Java API
Lehrstuhl für Software-Design und –Qualität (SDQ)
Institut für Programmstrukturen und Datenorganisation (IPD)
Organisatorisches: Programmieren SS 2016
  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
3
13.01.2016
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“
4
13.01.2016
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
5
13.01.2016
Vorlesung Programmieren: Java API
Lehrstuhl für Software-Design und –Qualität (SDQ)
Institut für Programmstrukturen und Datenorganisation (IPD)
Java API
6
13.01.2016
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
7
13.01.2016
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
8
13.01.2016
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);
}
9
13.01.2016
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]>
<?
Animal>
class Object
 <
? extends [T]>
<?
Animal>
is-a
class LivingOrganism
is-a
class Animal
is-a
class Mammal
is-a
class Dog
10
13.01.2016
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)
10
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
11
13.01.2016
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));
12
13.01.2016
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);
}
13
13.01.2016
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
14
13.01.2016
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();
}
15
13.01.2016
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]
16
13.01.2016
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
17
13.01.2016
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
18
13.01.2016
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();
19
13.01.2016
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)
20
13.01.2016
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
21
13.01.2016
Vorlesung Programmieren: Java API
Lehrstuhl für Software-Design und –Qualität (SDQ)
Institut für Programmstrukturen und Datenorganisation (IPD)
Herunterladen