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 10. Software-Qualität 2. Einfache Programme 11. Algorithmen und Datenstrukturen II 3. Kontrollstrukturen 12. Objektorientierung II 4. Objekt-Orientierung I 13. Komponenten 5. Algorithmen und Datenstrukturen I 14. Design 6. Interfaces 15. Die Java Klassenbibliothek I 7. Rekursion 16. Die Java Klassenbibliothek II 8. Pakete 17. Software-Kategorien 9. Fehler und Ausnahmen Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 2 Agenda Agenda Interfaces Interfaces Sortieren JUnit Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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 cd Collections «interface» List + + + + add() : void get() : void contains() : void remove() : void Klasse: – enthält die Innensicht, das heißt die Sicht des Programmierers «realize» ArrayList «realize» LinkedList – ist komplex – ist speziell Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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); } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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) {...}; } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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) { ... }; } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 7 Interfaces Übersicht über Collections, Maps und deren Interfaces Collection List Map Set SortedMap HashMap Hashtable ArrayList Vector HashSet SortedSet TreeMap LinkedList Interface Stack TreeSet Class Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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) add Ensures that this collection contains the specified element (optional operation). boolean contains(Object o) contains Returns true if this collection contains the specified element. boolean remove(Object o) remove Removes a single instance of the specified element from this collection, if it is present (optional operation). Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 9 Interfaces Interface Collection Methoden, die den ganzen Container betreffen: void clear() clear Removes all of the elements from this collection (optional operation). boolean isEmpty() isEmpty Returns true if this collection contains no elements. Iterator iterator() iterator Returns an iterator over the elements in this collection int size() size Returns the number of elements in this collection. Object[] toArray() toArray Returns an array containing all of the elements in this collection. Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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() ); } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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 } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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); } Zugriff auf Werte einer Map //Hallo 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. Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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) add Inserts the specified element at the specified position in this list (optional operation). Object remove(int index) remove Removes the element at the specified position in this list (optional operation). Object get(int index) get Returns the element at the specified position in this list. Object set(int index, Object element) set Replaces the element at the specified position in this list with the specified element (optional operation). Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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). Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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. Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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. Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 17 Interfaces Funktionen auf Collections z.B. makeHistogram public class Util { public static Map makeHistogram(Collection collection) { makeHistogram 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; } ... } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 18 Agenda Agenda Interfaces Sortieren Sortieren JUnit Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 19 Sortieren Sortieren von Objekten Collection mit geordneten Elementen (zum Beispiel List): l = {e1, …en} l ist sortiert, wenn ei ≤ ei+1 (1 ≤ i ≤ n-1) Aber was heißt eigentlich „≤“? Ordnung auf Elementen Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 20 Sortieren Interface Comparable Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 21 Sortieren Sort Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 22 Sortieren Jede Menge *ables Adjustable Iterable Streamable Appendable Joinable Throwable Callable Manageable Timeable Cloneable Printable Transferable Comparable REadable Writeable Destroyable Referncable Externalizable Refrehable Flushable Runnable Formatable Scrollable Identifyable Serializable Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 23 Agenda Agenda Interfaces Sortieren JUnit JUnit Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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 Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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 Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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 Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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]); } } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 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 Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 29 JUnit Starten unter Eclipse Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 30 JUnit Ausgabe im TestRunner Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 22.11.2005, Seite 31