6. Interfaces Grundlagen der Programmierung 1 (Java) Fachhochschule Darmstadt Haardtring 100 D-64295 Darmstadt Prof. Dr. Bernhard Humm FH Darmstadt, 22. November 2005
Einordnung im Kontext der Vorlesung 1. Einführung 2. Einfache Programme 3. Kontrollstrukturen 4. Objekt-Orientierung I 5. Algorithmen und Datenstrukturen I 6. Interfaces 7. Rekursion 8. Pakete 10. Software-Qualität 11. Algorithmen und Datenstrukturen II 12. Objektorientierung II 13. Komponenten 14. Design 15. Die Java Klassenbibliothek I 16. Die Java Klassenbibliothek II 17. Software-Kategorien 9. Fehler und Ausnahmen 22.11.2005, Seite 2
Agenda Agenda Interfaces Sortieren JUnit 22.11.2005, Seite 3
Interfaces Das Denken in Schnittstellen (Interfaces) ist eines der wichtigsten Konzepte der Programmierung Interface: beschreibt die Außensicht, das heißt die Sicht des Nutzers ist einfach ist vielseitig verwendbar Klasse: enthält die Innensicht, das heißt die Sicht des Programmierers ist komplex ist speziell cd Collections «interface» List + add() : void + get() : void + contains() : void + remove() : void «realize» ArrayList «realize» LinkedList 22.11.2005, Seite 4
Interfaces Deklaration eines Interface Interfaces definieren das Verhalten von Objekten. Interfaces enthalten: Instanzmethoden Konstanten Interfaces haben keine Konstruktoren. Interfaces enthalten keine Implementierung. interface ICustomer { public String getname(); public void setname(string name); } 22.11.2005, Seite 5
Interfaces Verwendung eines Interface Man sagt: Eine Klasse implementiert ein Interface, wenn sie jede einzelne Methode des Interfaces bereitstellt. Eine Klasse kann beliebig viele Interfaces implementieren. Ein Interface kann von beliebig vielen Klassen implementiert werden. Eine Referenz auf ein Interface kann überall dort im Code eingesetzt werden, wo auch eine Referenz auf eine Klasse erlaubt ist. class MyCustomerImpl implements ICustomer { public MyCustomerImpl(String name) {...}; public String getname() {...}; public void setname(string name) {...}; } 22.11.2005, Seite 6
Interfaces Beispiel: Zugriff auf Kundendaten (mit Interface) ICustomer mycustomer = new MyCustomerImpl( Willi );... Map mycustomers = new HashMap(); mycustomers.put( Kunde1234, mycustomer); mycustomer = (ICustomer) mycustomer.get( Kunde1234 ); class SomeOtherClass { } public boolean processcustomer(icustomer cust) {... }; 22.11.2005, Seite 7
Interfaces Übersicht über Collections, Maps und deren Interfaces Collection Map List Set SortedMap HashMap Hashtable ArrayList Vector HashSet SortedSet TreeMap LinkedList Stack TreeSet Interface Class 22.11.2005, Seite 8
Interfaces Interface Collection Allgemeiner Container von Objekten. Objekte dürfen mehrfach vorkommen. Methoden, die ein Element betreffen: boolean add(object o) Ensures that this collection contains the specified element (optional operation). boolean contains(object o) Returns true if this collection contains the specified element. boolean remove(object o) Removes a single instance of the specified element from this collection, if it is present (optional operation). 22.11.2005, Seite 9
Interfaces Interface Collection Methoden, die den ganzen Container betreffen: void clear() Removes all of the elements from this collection (optional operation). boolean isempty() Returns true if this collection contains no elements. Iterator iterator() Returns an iterator over the elements in this collection int size() Returns the number of elements in this collection. Object[] toarray() Returns an array containing all of the elements in this collection. 22.11.2005, Seite 10
Interfaces Iteratoren Mache etwas mit allen Elementen eines Behälters: Iteratoren für Schleifen. Sie zeigen auf ein Element des Behälters, verwalten Schleifen, merken sich die aktuelle Position. Sie werden erzeugt über Methoden des Behälters: iterator(). List list = new ArrayList(); list.add(new Customer( Hans Otto )); list.add(new Customer( Willi Wühlmaus )); Iterator iter = list.iterator(); while ( iter.hasnext() ) { Customer customer = (Customer) iter.next(); System.out.println( customer.getname() ); } 22.11.2005, Seite 11
Interfaces Interface Iterator Wie die Collections so werden Iteratoren normalerweise über ihre Interfaces angesprochen. Jede Collection hat ihre eigene Iterator-Implementierung. Iterator: lesen vorwärts; ListIterator: beide Richtungen public interface Iterator { boolean hasnext(); Object next(); // Dereferenzierung: akt. Element void remove(); // entferne aktuelles Element } 22.11.2005, Seite 12
Interfaces Vereinfachter Zugriff auf Collections (ab JDK 1.5) int[] xs = {1,3,7,11} for (int x : xs) System.out.println(x); Zugriff auf Array List as = new ArrayList(); //as befüllen... for (Object a : as) System.out.println(a); Zugriff auf beliebige Klasse, die Iterable implementiert. So z.b. alle Collections. Map dict = new HashMap(); dict.put( Eins, "Hallo"); for ( Object o : dict.values() ){ System.out.println(o); } //Hallo Zugriff auf Werte einer Map Was steckt hinter dem erweiterten for? Der Compiler macht aus der erweiterten for-schleife die alte Variante mit Schleifenzähler oder Iterator. Darum sind auch keine Performance Probleme zu befürchten. Ein Zugriff auf den Schleifenzähler / Iterator ist nicht möglich. 22.11.2005, Seite 13
Interfaces Interface List extends Collection Container, der die Elemente in einer Reihenfolge vorhält. Methoden, die ein Element betreffen: void add(int index, Object element) Inserts the specified element at the specified position in this list (optional operation). Object remove(int index) Removes the element at the specified position in this list (optional operation). Object get(int index) Returns the element at the specified position in this list. Object set(int index, Object element) Replaces the element at the specified position in this list with the specified element (optional operation). 22.11.2005, Seite 14
Interfaces Interface Map Container, der Schlüssel-Wert (key-value) Paare speichert. Jeder Schlüssel darf höchstens einmal auftreten. Methoden, die einzelne Elemente betreffen: Object get(object key) Returns the value to which this map maps the specified key. Object put(object key, Object value) Associates the specified value with the specified key in this map (optional operation). Object remove(object key) Removes the mapping for this key from this map if it is present (optional operation). 22.11.2005, Seite 15
Interfaces Interface Map Methoden, zur Abfrage von Schlüsseln und Werten: boolean containskey(object key) Returns true if this map contains a mapping for the specified key. boolean containsvalue(object value) Returns true if this map maps one or more keys to the specified value. 22.11.2005, Seite 16
Interfaces Interface Map Methoden, die eine Sicht auf die Abbildung liefern: Set entryset() Returns a set view of the mappings contained in this map. Set keyset() Returns a set view of the keys contained in this map. Collection values() Returns a collection view of the values contained in this map. 22.11.2005, Seite 17
Interfaces Funktionen auf Collections z.b. makehistogram public class Util { public static Map makehistogram(collection collection) { Map result = new HashMap(); Iterator i = collection.iterator(); while (i.hasnext()) { Object x = i.next(); Integer cnt = (Integer) result.get(x); if (null == cnt) result.put(x, new Integer(1)); else result.put(x, new Integer(cnt.intValue() + 1)); } return result; }... } 22.11.2005, Seite 18
Agenda Agenda Interfaces Sortieren JUnit 22.11.2005, Seite 19
Sortieren Sortieren von Objekten Collection mit geordneten Elementen (zum Beispiel List): l = {e 1, e n } l ist sortiert, wenn e i e i+1 (1 i n-1) Aber was heißt eigentlich? Ordnung auf Elementen 22.11.2005, Seite 20
Sortieren Interface Comparable 22.11.2005, Seite 21
Sortieren Sort 22.11.2005, Seite 22
Sortieren Jede Menge *ables Adjustable Appendable Callable Cloneable Comparable Destroyable Externalizable Flushable Formatable Identifyable Iterable Joinable Manageable Printable REadable Referncable Refrehable Runnable Scrollable Serializable Streamable Throwable Timeable Transferable Writeable 22.11.2005, Seite 23
Agenda Agenda Interfaces Sortieren JUnit 22.11.2005, Seite 24
JUnit Überblick JUnit ist ein regressives Testframework Geschrieben von Erich Gamma und Kent Beck Entwicklung von Tests für beliebige Software-Einheiten OpenSource XProgramming www.junit.org 22.11.2005, Seite 25
JUnit Was unterstützt JUnit? Einfache Automatisierung der Tests Ausgabe der Ergebnisse erfolgt graphisch oder textuell Soll/Ist-Vergleich mittels assert()- und fail()-methoden Dokumentation der Testergebnisse 22.11.2005, Seite 26
JUnit Wie funktioniert JUnit? Anlegen einer Subklasse von TestCase (junit.framework.testcase) Definition eines Konstruktors mit Übergabeparameter Testname Öffentliche Methoden die mit test beginnen sind Testfälle Vor jedem Test wird - falls vorhanden - die öffentliche Methode setup() aufgerufen Nach jedem Test wird - falls vorhanden - die öffentliche Methode teardown() aufgerufen Die Testfälle einer Testklasse werden in der Methode suite() zusammengefasst Testklassen werden zu Testpaketen zusammengefasst 22.11.2005, Seite 27
JUnit Beispiel für einen TestCase import junit.framework.testcase; public class StrUtilJUnitTest extends TestCase { String txt; public StrUtilJUnitTest(String testcasemethodname) { super(testcasemethodname); } public void setup() { txt = "otto hugo rudie"; } public void teststr2strarray() { String[] arr1 = StrUtil.str2StrArr(txt); assertequals("otto", arr1[0]); assertequals("hugo", arr1[1]); assertequals("rudi", arr1[2]); } } 22.11.2005, Seite 28
JUnit Auswahl bereitgestellter Assert und Fail Metoden public static void assertequals(boolean expected, boolean actual) public static void assertequals(double expected, double actual, double delta) public static void assertnull(object object) public static void assertnotnull(object object) public static void assertsame(java.lang.object expected, lang.object actual) public static void asserttrue(boolean condition) public static void fail() public static void fail(string message) Alle Methoden werden auch mit einem Message-Parameter angeboten 22.11.2005, Seite 29
JUnit Starten unter Eclipse 22.11.2005, Seite 30
JUnit Ausgabe im TestRunner 22.11.2005, Seite 31