Softwaretechnik 1 Vorlesung Neuere Sprachelemente in Java Prof. Dr. Bernhard Rumpe Technische Universität Braunschweig http://www.sse.cs.tu-bs.de/
Seite 2 Neuerungen seit Java 5.0 Java Spracherweiterungen Statische Imports Variable Parameteranzahl Automatisches Boxing Annotations Aufzählungstypen Iteration Generische Typen Verbesserung der Java Virtual Machine Erweiterung der Klassenbibliothek...
Seite 3 Java 5.0 Statische Imports alt: Zugriff auf statische Elemente über Klassennamen double s = Math.cos(Math.PI); neu: Import von statischen Elementen, unqualifizierte Verwendung import static java.lang.math.*; double s = cos(pi);
Seite 4 Java 5.0 Variable Parameteranzahl alt: Methoden nur mit fester Parameteranzahl int sum(int val1, int val2) {... ; int sum(int val1, int val2, int val3) {... ; int sum(list values) {... ; neu: Methoden auch mit beliebiger Parameteranzahl, Zugriff wie auf ein Array int sum(int... values) { int result = 0; for(int i = 0; i < values.length; i++) result += values[i]; return result;
Seite 5 Java 5.0 Automatisches Boxing alt: manuelles ein- und auspacken der primitiven Typen Integer i1 = new Integer (5); //boxing list.add(i1); int i2 = i1.intvalue() + 2 ; //unboxing neu: list.add(5); //auto-boxing Integer i1 = 5; //auto-boxing int i2 = i1 + 2; //auto-unboxing
Seite 6 Java 5.0 Annotations Metainformationen im Quellcode Kein direkter Einfluss auf die Semantik Lesbar durch Tools oder Libraries aus Quellcode, Class-Files und zur Laufzeit Eigene Annotations können entwickelt werden Beispiel (JUnit 4 Test): @Test(timeout = 1000) public void testinfinity() { while (true) ; @ gefolgt vom Annotation-Typ Parameter können übergeben werden
Seite 7 Java 5.0 Aufzählungstypen alt: kein expliziter Aufzählungstyp vorhanden Abhilfe: Liste von Konstanten Aufzählungsmuster neu: enum Wochentag { MO, DI, MI, DO, FR, SA, SO; public boolean iswerktag() { switch(this) { case SO : case SA : return false; default : return true; public static void main(string[] args) { Wochentag t = Wochentag.DI; System.out.println(t + " " + t.iswerktag()); // DI true
Seite 8 Java 5.0 Iteration alt: Schleifensteuerung explizit ausprogrammieren public static void main(string[] args) { for ( int i = 0; i < args.length; i++ ) System.out.println( args[i] ); neu: for each verfügbar, falls Interface java.lang.iterable implementiert wird für alle neuen Collections und Arrays verfügbar public static void main(string[] args) { for ( String arg : args ) System.out.println( arg );
Seite 9 Java 5.0 Generische Typen, Motivation Bisher: Containerklassen speichern Objekte vom Typ Object Folgen: ArrayList stringlist = new ArrayList(); stringlist.add ( Hallo ); Container akzeptiert jedes Objekt. Kein Schutz gegen Objekte eines unerwünschten Typs. stringlist.add (new Integer(5)); Container liefert immer Object. Cast von Objekten nötig, da Typinformation verloren geht. String s0 = (String) stringlist.get(0); String s1 = (String) stringlist.get(1); // Laufzeitfehler
Seite 10 Java 5.0 Generische Typen, Lösung Generische Typen erlauben statische Überprüfung der Typsicherheit zur Übersetzungszeit ArrayList<String> stringlist = new ArrayList <String>(); stringlist.add ( Hallo ); stringlist.add (new Integer(5)); //compile Fehler String s0 = stringlist.get(0); Es werden keine Casts mehr benötigt Typinformation bleibt erhalten
Seite 11 Java 5.0 Generische Typen Klassen oder Interfaces wie bisher definieren + Typvariable T Typvariable im Klassenrumpf wie konkreter Typ verwendbar class Box <T> { T inhalt; Box (T inhalt) {this.inhalt = inhalt; void setinhalt (T inhalt) { ; T getinhalt() { ; Anwendung: Festlegung auf einen konkreten Typ für T Box<String> b1 = new Box<String>( Hallo ); Box<Integer> b2 = new Box<Integer>(5);
Seite 12 Java 5.0 Generische Typen, mehrere Typvariablen Definition mit Typvariablen-Liste: <T1, T2, > class Pair <T,U> { T first; U second; Anwendung: Pair(T fst, U snd) { first = fst; second = snd; Pair<String, Integer> p = new Pair<String, Integer> ( Hallo, 5);
Seite 13 Java 5.0 Generische Typen, Vererbung Von generischen Klassen lassen sich Unterklassen bilden class UniPair <T> extends Pair <T,T> { UniPair(T fst, T snd) { super(fst,snd); Unterklassen müssen keine generischen Klassen sein class StringUniPair extends UniPair <String> { StringUniPair(String fst, String snd) { super(fst,snd);
Seite 14 Java 5.0 Generische Typen, Vererbung Etwas unintuitive Typbeziehung: LinkedList<String> ist Subtyp von List<String> List<String> ist aber nicht Subtyp von List<Object> List<String> slist = new LinkedList<String>(); List<Object> olist = slist; //nicht möglich olist.add(new Object()); String s = slist.get(0); //Zuweisung von Object an String
Seite 15 Java 5.0 Generische Typen, Wildcards Problem: Ausgabe einer Collection alt: public void printcollection (Collection c) { neu: 1. Versuch mit Generics public void printcollection (Collection<Object> c) { Iterator i = c.iterator(); for(k=0; k<c.size(); k++) { System.out.println(i.next()); for(object e: c) { System.out.println(e); neu: 2. Versuch, Collection<Object> ist kein Supertyp aller Collections, es ist Collection<?> (collection of unknown) public void printcollection (Collection<?> c) { for(object e: c) { System.out.println(e);
Seite 16 Java 5.0 Generische Typen, Wildcards ArrayList<? extends Number> list; ArrayList<? super Number> list; Typargument muss vom Number abgeleitet sein (upper bound wildcard) list = new ArrayList<Integer>(); //ok list = new ArrayList<Object>(); //error Lesen + Number n = list.get(0); //ok Typargument muss Basisklasse vom Number sein (lower bound wildcard) list = new ArrayList<Integer>(); //error list = new ArrayList<Object>(); //ok Lesen - Number n = list.get(0); //error Schreiben - list.add(new Integer(5)); //error Schreiben + list.add(new Integer(5)); //ok
Seite 17 Java 5.0 Generische Typen, Wildcards Beispiel: List<? extends Number> numberlist; List<Integer> intlist = new ArrayList<Integer>(); numberlist = intlist; numberlist.add(new Integer(0)); //compile Fehler intlist.add(new Integer(0));
Seite 18 Java 5.0 Generische Typen, Type Bounds Type Bounds mit extends funktionieren nicht nur für Wildcards sondern auch für Typvariablen Einschränkung der Typen durch maximal 1 Oberklasse und beliebige Anzahl von Interfaces class Box<T extends Comparable & Serializable> {
Seite 19 Java 5.0 Generische Methoden Problem: Elemente eines Arrays in eine Collection füllen 1. Versuch: static void fromarraytocollection (Object[ ] a, Collection <?> c){ for (Object o : a) c.add(o); // compile Fehler Objects können nicht in Collection mit unbekanntem Typ eingefügt werden. 2. Versuch: Verwendung einer Generischen Methode, einer Methode, die mit einer Typvariablen parametrisiert ist. static <T> void fromarraytocollection (T[ ] a, Collection <T> c){ for (T o : a) c.add(o);
Seite 20 Neuerungen seit Java 5.0 Java Spracherweiterungen Statische Imports Variable Parameteranzahl Automatisches Boxing Aufzählungstypen Iteration Generische Typen Annotations Verbesserung der Java Virtual Machine Erweiterung der Klassenbibliothek...