Spracherweiterungen in Java 5

Ähnliche Dokumente
Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

5. Tutorium zu Programmieren

Java für Computerlinguisten

Objektorientierte Programmierung. Kapitel 12: Interfaces

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

Java Einführung Collections

1 Polymorphie (Vielgestaltigkeit)

Java-Schulung Grundlagen

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Programmieren in Java

Kapitel 6. Vererbung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Kapitel 6. Vererbung

Algorithmen und Datenstrukturen 07

3 Objektorientierte Konzepte in Java

Java Einführung Methoden in Klassen

Kapitel 6. Vererbung

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Java Schulung (Java 2 Java Development Kit 5 / 6)

C# im Vergleich zu Java

Javakurs für Anfänger

Java: Vererbung. Teil 3: super()

Distributed Computing Group

Programmieren in Java

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Android will doch nur spielen. Java Eine kurze Einführung

Javakurs 2013 Objektorientierung

13. Tutorium zu Programmieren

Datenbankanwendungsprogrammierung Crashkurs Java

Programmieren Tutorium

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

3 Objektorientierte Konzepte in Java

Software Engineering Klassendiagramme Einführung

Einführung in ActionScript

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Abschnitt 9: Schnittstellen: Interfaces

Objekt-Orientierte Programmierung

Primitive Datentypen

Probeklausur: Programmierung WS04/05

5.6 Vererbung. Vererbung

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

5. Abstrakte Klassen

Innere Klassen in Java

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

5.4 Klassen und Objekte

Themen. Web Service - Clients. Kommunikation zw. Web Services

Objektorientierte Programmierung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Objektorientierte Programmierung. Kapitel 16: Pakete, Zugriffsschutz

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Beispiel: DB-Mock (1/7)

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Neue Features in C# 2.0

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Allgemein: Klassen testbar machen. 5. Mocking. Mocks programmieren. Zusammenspiel von Klassen testen

Info: Standard DO-178B. 5. Mocking. Zusammenspiel von Klassen testen. Allgemein: Klassen testbar machen

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Algorithmen und Datenstrukturen

Betreutes Programmieren Vorlesung Informatik II, Blatt 7 Musterlösung

Schnittstellen implementieren am Beispiel Suchbaum

Programmierkurs Java

Objektorientierte Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Teil 1: Grundeigenschaften von Rechnern und Software

Studentische Lösung zum Übungsblatt Nr. 7

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

II.1.1. Erste Schritte - 1 -

Klassenbeziehungen & Vererbung

Typumwandlungen bei Referenztypen

Generische Typen in Java 1.5. Die Erweiterung der Java Language Specification

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Das Test-Framework JUnit ETIS SS04

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Java-Programmierung. Remote Method Invocation - RMI

Repetitorium Informatik (Java)

Teil 1: Grundeigenschaften von Rechnern und Software

Java Generics & Collections

Tutorium Java Ein Überblick. Helge Janicke

Aufgabe 1. »Programmieren«, WS 2006/2007. Nino Simunic M.A.

Objektorientierte Programmierung

Ein erstes Java-Programm

Dynamische Sprachen auf der JVM

Klassen in Java. Klassen

Java Einführung Programmcode

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

Java Einführung Abstrakte Klassen und Interfaces

Computeranwendung und Programmierung (CuP)

2. Semester, 2. Prüfung, Lösung

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Variablen manipulieren per JDI

Polymorphie in Java oder Generics und Co.

Java Kurs für Anfänger Einheit 5 Methoden

Prinzipien Objektorientierter Programmierung

Musterlösungen zur Klausur Informatik 3

Software-Engineering Software-Management

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Arrays in Java. Text. Stefan Brotschi

Transkript:

Spracherweiterungen in Java 5 Dennis Giffhorn Lehrstuhl für Programmierparadigmen Universität Karlsruhe 17. April 2008

Spracherweiterungen in Java 5 Generics (s. Vorlesung) Annotations Enumerations Methoden mit variabler Anzahl von Parametern Erweiterte for-schleife Autoboxing / -unboxing Static Imports Überschreiben von Methoden-Rückgabetypen

Generics Generics werden in der Vorlesung vorgestellt, hier nur kurz die Idee. Vor Java 1.5 List l = new LinkedList(); l.add(new Integer(5)); l.add( String );... Integer i = (Integer) l.get(0); // Typecasts Integer j = (Integer) l.get(1); // Programmabsturz

Generics Sicher durch Generics List<Integer> l = new LinkedList<Integer>(); l.add(new Integer(5)); l.add( String ); // verbietet der Compiler... Integer i = l.get(0); // keine Typecasts mehr

Annotations Annotations bieten die Möglichkeit, in einem Programm struktuiert zusätzlich Daten unterzubringen. @Author(name="Mirko Streckenbach") class Test { @LastChanged(date="2006-01-27") public static void main(string[] args) { Author a=test.class.getannotation(author.class); System.out.println("written by "+a.name());

Annotations Annotations bieten die Möglichkeit, in einem Programm struktuiert zusätzlich Daten unterzubringen. @Author(name="Mirko Streckenbach") class Test { @LastChanged(date="2006-01-27") public static void main(string[] args) { Author a=test.class.getannotation(author.class); System.out.println("written by "+a.name());

Annotations Annotations bieten die Möglichkeit, in einem Programm struktuiert zusätzlich Daten unterzubringen. @Author(name="Mirko Streckenbach") class Test { @LastChanged(date="2006-01-27") public static void main(string[] args) { Author a=test.class.getannotation(author.class); System.out.println("written by "+a.name());

Annotations: Anwendungen Anwendungen: Die Daten können von Tools weiterverarbeitet oder zur Laufzeit (Reflection) abgefragt werden. Nützlich in allen Bereichen, wo Source-Code automatisch verarbeitet wird: JavaDoc JUnit Revisionskontrolle (vgl. ident) Formaler Mechanismus für bisherige Konventionen Namenskonvention für Testmethoden in JUnit Strukturierte Kommentare für Autor, Datum, etc... Annotations für den Compiler, z.b. um bekannte Warnungen zu unterdrücken (@SuppressWarnings)

Annotations: Spezifikation Annotations können ähnlich zu Interfaces spezifiziert werden: @Author(name="Mirko Streckenbach") class Test {... @Retention(value=RetentionPolicy.RUNTIME) @interface Author { String name(); String company() default "unspecified"; ; @Retention ist eine Meta-Annotation und spezifiziert den Lebensraum der Annotation.

Annotations: Spezifikation @Retention(value=RetentionPolicy.RUNTIME) @interface Author { String name(); String company() default "unspecified"; ; Methoden dürfen keine Parameter und Exceptions haben primitive Typen, String, Class, Enums, Annotationen Arrays dieser Typen Im Prinzip: Typ + Name + optionale Default-Werte

Annotations: Spezifikation Annotiert werden können: Klassen und Interfaces Konstruktoren, Methoden und Fields Parameter und lokale Variablen andere Annotations und Packages

enum enum: Menge von symbolischen Konstanten In Java bisher übliche Implementierung: static final int AMPEL ROT = 1; static final int AMPEL ROTGELB = 2; static final int AMPEL GELB = 3; static final int AMPEL GRUEN = 4; int lights = AMPEL_ROT; Nachteile: Fehleranfällig bei Änderung und Erweiterungen lights kann ungültige Werte annehmen Der Inhalt von lights hat keinen Dokumentationswert: System.out.println(lights) liefert 1

enum daher: Unterstützung für enum in der Sprache enum Ampel { ROT, ROTGELB, GELB, GRUEN ; Ampel lights = Ampel.ROT; switch(lights) { case ROT: lights=ampel.rotgelb; break; case ROTGELB: lights=ampel.gruen; break; case GRUEN: lights=ampel.gelb; break; Vorteile: beseitigt alle o.g. Nachteile abgeschlossene Menge Compiler warnt im switch wegen fehlendem GELB (muss man aber explizit einstellen) implementieren Comparable und Serializable

enum: Technische Realisierung (konzeptuell) enum wird zur Klasse, Werte zu Objekten: final class Ampel... { private final String name; private Ampel(String name) { this.name = name; static final Ampel ROT = new Ampel("ROT"); static final Ampel ROTGELB = new Ampel("ROTGELB"); static final Ampel GRUEN = new Ampel("GRUEN"); static final Ampel GELB = new Ampel("GELB"); Ampel[] values() { return new Ampel[]{ ROT,ROTGELB,GRUEN,GELB ; Ampel valueof(string s) {...

Eigene Members in enum Eigener Konstruktor (Parameter hinter enum-konstanten) Beliebige Attribute Beliebige Methoden enum Month { JAN(31), FEB(28), MAR(31), APR(30), MAY(31), JUN(30), JUL(31), AUG(31), SEP(30), OCT(31), NOV(30), DEC(31); private int days; Month(int days) { this.days = days; int getdays(int year) { return days;

Konstantenspezifische Methoden enum Month { JAN(31), FEB(28) { int getdays(int y) { return (y % 4 == 0? 29 : 28);, MAR(31), APR(30), MAY(31), JUN(30), JUL(31), AUG(31), SEP(30), OCT(31), NOV(30), DEC(31); private int days; Month(int days) { this.days = days; int getdays(int year) { return days;

Methoden mit variabler Anzahl von Parametern Bisher: String join(string concat, String[] args); Zum Aufruf von join muss man ein Array erzeugen: String[] str = new String[] {"http:","","www.uni-karlsruhe.de"; join("/", str);

Methoden mit variabler Anzahl von Parametern Syntax: String join(string concat, String... args); join kann dann mit einer beliebigen Zahl von Argumenten aufgerufen werden: join(" ","Hello","World"); join("/","http:","","www.uni-karlsruhe.de"); Technische Realisierung: Im Rumpf von join ist args einfach ein Array von String; das Array wird an der Aufrufstelle erzeugt.

Methoden mit variabler Anzahl von Parametern Leider schafft das kleinere Probleme: void f(object o) {... void f(object[] o) {... void g(object o) {... void g(object... o) {...... void foo(string[] args) { f(args); // eindeutig: f(object[]) g(args); // mehrdeutig Lösung: g((object)args); // -> g(object) g((object[])args); // -> g(object...)

Autoboxing/-unboxing Automatische Konvertierung zwischen Basis- und Objekt-Typen: Vorher: Integer i = new Integer(3); int j = i.intvalue();

Autoboxing/-unboxing Automatische Konvertierung zwischen Basis- und Objekt-Typen: Nachher: Integer i = 3; int j = i;

Autoboxing/-unboxing Automatische Konvertierung zwischen Basis- und Objekt-Typen: Nachher: Integer i = 3; int j = i; Besonders nützlich im Zusammenspiel mit generischen Containern: List l = new LinkedList(); l.add(0, new Integer(42)); int x = ((Integer)l.get(0)).intValue();

Autoboxing/-unboxing Automatische Konvertierung zwischen Basis- und Objekt-Typen: Nachher: Integer i = 3; int j = i; Besonders nützlich im Zusammenspiel mit generischen Containern: List l = new LinkedList(); l.add(0, new Integer(42)); int x = ((Integer)l.get(0)).intValue(); wird zu: List<Integer> l = new LinkedList<Integer>(); l.add(0, 42); int x = l.get(0);

Erweiterte for-schleife Mit der foreach-schleife kann direkt über die Elemtente eines Containers iteriert werden: void main(string[] args) { for(string s : args) System.out.println(s); Außer über Arrays kann über alle Objekte iteriert werden, die das Interface Iterable<E> implementieren. public interface Iterable<E> { Iterator<E> iterator(); Die Java Container Klassen implementieren dieses Interface.

static Imports Statische Methoden und Felder können einzeln importiert und direkt benutzt werden: Bisher: double y = Math.sqrt(14.0);

static Imports Statische Methoden und Felder können einzeln importiert und direkt benutzt werden: Mit static imports: import static Math.sqrt;... double y = sqrt(14.0);

static Imports Besonders praktisch im Zusammenhang mit Enums: import static verkehr.ampel.*;... Ampel a = ROT;

Überschreiben von Methoden-Rückgabetypen Eine Methodenredifinition in einer Unterklasse darf einen stärkeren Rückgabewert haben als die ursprüngliche Definition (covariant returns) Häufige Anwendung ist clone-methode Bisher: class Test { Object clone() {...

Überschreiben von Methoden-Rückgabetypen Eine Methodenredifinition in einer Unterklasse darf einen stärkeren Rückgabewert haben als die ursprüngliche Definition (covariant returns) Häufige Anwendung ist clone-methode Jetzt: class Test { Test clone() {...

Überschreiben von Methoden-Rückgabetypen Generell: class A { class B extends A { Vorher: class ObserverA { A data; A getsubject() { return data; class ObserverB extends ObserverA { B data; A getsubject() { return data;

Überschreiben von Methoden-Rückgabetypen Generell: class A { class B extends A { Nachher: class ObserverA { A data; A getsubject() { return data; class ObserverB extends ObserverA { B data; B getsubject() { return data;

Überschreiben von Methoden-Rückgabetypen Technische Realisierung: Compiler erzeugt zusätzliche Wrapper-Methode. Idee (funktioniert nur im Byte-Code): class ObserverB extends ObserverA { B data; A getsubject() { return data; B getsubject() { A a = getsubject(); return (B) a;

Zusammenfassung Java 5 bietet: Zwei große Erweiterungen: Generics und Annotations Mehrere kleine Erweiterungen Fazit: Generics und Enums holen nur Ausgelassenes nach. Nur Annotations sind wirklich neu, ansonsten viel syntactic sugar. Viele Möglichkeiten zur Verbesserung der Übersichtlichkeit von Quelltexten. Ursprüngliche Simplizität von Java geht verloren. Anpassung alten Codes ist nicht trivial (Generics). Technische Realisierung ist teilweise kompliziert.

Weiterführendes Annotations: Erklärungen von Sun http://java.sun.com/j2se/1.5.0/docs/guide/ language/annotations.html Java 5 Erweiterungen: http://java.sun.com/j2se/1.5.0/docs/guide/language/