Vorlesung Informatik 2 Fachhochschule für Technik Esslingen Studiengang Wirtschaftsinformatik Neues in Java 5.0 (Tiger) Dr. rer. nat. Andreas Rau http://www.fht-esslingen.de/~rau [email protected] Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #1 Inhalt Die folgenden Folien fassen die wichtigsten Neuigkeiten in Java 5.0 (Tiger) zusammen. Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #2 Übersicht Ziel von Java 5.0 war es, den Programmierer durch Erweiterungen der Sprache davon zu entlasten, nicht vorhandene Sprachelemente mühsam von Hand nachzubauen. Alle Neuerungen werden durch den neuen Java Compiler so in Bytecode übersetzt, dass sie auch mit alten JVMs laufen(!). Es handelt sich also nicht um etwas grundsätzlich Neues sondern um eine intelligente Anwendung der vorhandenen Konzepte. Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #3 Enums(1) Hintergrund Obwohl in anderen Programmiersprachen wie C schon lange vorhanden gab es in Java bis zur Version 5.0 keine Enums. Stattdessen wurde mit primitiven Datentypen, konstanten Objekten oder selbstkreiierten Klassen zur Nachbildung von Enums gearbeitet. Nachteil dabei war regelmäßig der erhöhte Schreibaufwand, die mangelnde Lesbarkeit und die fehlende Typsicherheit. Beispiele public static final int LOW = 1; public static final int MEDIUM = 2; public static final int HIGH = 3; int gear; gear = LOW; // OK gear = 5; // OK? Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #4 Enums(2) Bedeutung Ein Enum ist eine Aufzählung einer diskreten Wertemenge. Die Menge aller Werte bildet einen eigenen Datentyp. Eine Zuweisung an entsprechnde Variablen darf nur mit nur gültigen Werte aus der vordefinierten Menge erfolgen. Typische Operationen: ● Auflistung aller Werte “ Reihenfolge und Kodierung der Werte spielen i.a. keine Rolle. Letztere kann jedoch interessant werden, wenn man Enums in einer Datenbank speichern will. Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #5 Enums(3) Implementierung Enums in Java werden mit Hilfe des neuen Schlüsselworts enum defininiert und sind finale Subklassen von java.lang.Enum. Sie sind also verkappte Klassen und können (demnach) all deren Eigenschaften wie z.B. Konstruktoren, Instanzvariablen oder Methoden haben, Schnittstellen implementieren und in Paketen oder anderen Klassen untergebracht werden. Allerdings kann man Enum-Typen nicht instantiieren oder weiter verfeinern. “ Dafür bekommt man nützliche Standardfunktionen wie values() geschenkt. Beispiel enum Speed { HIGH, MEDIUM, LOW; } Speed speed = HIGH; Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #6 ForEach(1) Hintergrund Datenstrukturen wie Arrays und Schleifen stehen in einer Art „symbiotischen Beziehung“, d.h. man kann die einen gut mit den anderen bearbeiten. Allerdings ist dazu mitunter eine Menge Verwaltungsaufwand nötig. Dies gilt insbesondere dann, wenn es sich um eine komplexere Datenstruktur handelt, bei der kein wahlfreier Zugriff via Index möglich ist oder die Anzahl der Elemente nicht feststeht. In manch anderen Programmiersprachen gibt es zur Bearbeitung von Wertemenge spezielle “ Schleifenkonstrukte (for each). Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #7 ForEach(2) Bedeutung Datenstrukturen sind Ansammlungen von Werten/Objekten die zwar unterschiedlich organisiert sein können aber i.d.R. zumindest eine Möglichkeit bieten (in einer nicht näher definierten Reihenfolge) über die enthaltenen Daten zu iterieren. Grundlage einer solchen Iteration sind (1) Anfangspunkt, (2) Endpunkt, (3) Aktuelles Objekt, (4) Weiterschalten. Der Programmierer interessiert sich dabei jedoch meist nur für das “ aktuelle Objekt und ggf. den Endpunkt. Alles andere ist mehr oder weniger syntaktischer Ballast der durch ein geeignetes Schleifenkonstrukt nach Möglichkeit verborgen werden soll. Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #8 ForEach(3) Implementierung Klassische Iterationen über Arrays oder Collections werden in Java mit Hilfe von for-Schleifen oder while-Schleifen mit Iterator implementiert. Die neue Syntax für for-each Schleifen bietet eine einheitliche Form für beides. Allerdings wurde bewußt auf neue Schlüsselwörter verzichtet. Beispiel for (int i=0; i<arr.length; i++) { int current = arr[i]; } Iterator iter = coll.iterator(); while (iter.hasNext()) { Object current = iterator.next(); } Andreas Rau, 23.03.07 “ for ( int current : arr) { } for ( Object current : coll) { } D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #9 Generics(1) Hintergrund Mit Hilfe der Klasse Object und der Vererbungshierarchie darunter ist es möglich, universelle Algorithmen und Datenstrukturen für vielfältige Objekte zu implementieren. Allerdings geht dabei die Typsicherheit teilweise verloren. Eine Einschränkung auf einen bestimmten Typ ist nur durch zusätzliche Schreibarbeit (Prüfungen, Kapselung) möglich. Um solche Nachteile zu umgehen, bieten viele mit Java vergleichbare Programmiersprachen Mechanismen wie z.B. Templates an. Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #10 Generics(2) Bedeutung Ein Template ist eine Vorlage oder Schablone für eine Familie von Algorithmen bzw. Datenstrukturen. Dabei steht die Struktur schon exakt fest. Lediglich einige Typangaben sind mit Hilfe von Platzhaltern formuliert und werden erst bei der Verwendung der Vorlage durch einen konkreten Typ ersetzt. Praktisch bedeutet dies, dass der Compiler „die Vorlage unter Verwendung des angegebenen Typs nochmal abschreibt“ und übersetzt. In Java heißt der entsprechende Mechanismus Generics. Damit lassen sich keine Templates sondern sogenannte parametrisierte Typen definieren. Diese werden nicht wie Templates mehrfach instantiiert sondern nur zur Übersetzungszeit mit zusätzlichen Prüfungen überwacht. Das Prinzip ist ähnlich, jedoch wird auf diese Art und Weise wesentlich weniger Code erzeugt. Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #11 Generics(2a) Beispiel (ohne Generics) // (1) Keine Prüfung beim Befüllen List liste = new ArrayList(); liste.add( "Test"); liste.add( new Integer(1)); // ... // (2) Zugriff erfordert Cast (kann schiefgehen) String s = (String)liste.get(0); Integer i = (Integer)liste.get(0); // Laufzeitfehler // (3) Schleifen sind "unbequem" for ( Object s : liste) { // ... } Iterator iter = liste.iterator(); while ( iter.hasNext()) { String s = (String)iter.next(); } Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #12 Generics(2a) Beispiel (mit Generics) // (1) Prüfung beim Befüllen List<String> liste = new ArrayList<String>(); liste.add( "Test"); liste.add( new Integer(1)); // Compile-Fehler // ... // (2) Zugriff ohne Cast (klappt immer) String s = liste.get(0); Integer i = liste.get(0); // Compile-Fehler // (3) Schleifen sind "unbequem" for ( String s : liste) { // ... } Iterator<String> iter = liste.iterator(); while ( iter.hasNext()) { String s = iter.next(); } Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #13 Generics(3) Implementierung Um eine generische Klasse (mit generischen Methoden) zu schreiben, gibt man bei der Definition einen oder mehrere Platzhalter für Datentypen an. Diese werden bei der Deklaration(=Verwendung) durch reale Datentypen ersetzt. Beispiel public class Capsule<T> { T value; public Capsule( T value) { this.value = value; } } Capsule<String> capsule = new Capsule<String>( “Beispiel“); Andreas Rau, 23.03.07 D:\home\ar\fhte\vorlesungen\informatik2\folien\informatik2-theorie-tigernews.sdd #14