Java API

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