Institut für Programmierung und Reaktive Systeme Weitere Sprachfeatures Markus Reschke 21.08.2014 Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Strings Klasse String schon bekannt Typ für Zeichenketten Hier neu: ein paar Methoden dieser Klasse Markus Reschke | Weitere Sprachfeatures | 2 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Methoden von String Siehe StringEx.java Markus Reschke | Weitere Sprachfeatures | 3 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen String-Builder String-Objekte nicht veränderbar + erzeugt neue String-Objekte Ineffizient für viele Konkatenationen Alternative: StringBuilder Markus Reschke | Weitere Sprachfeatures | 4 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen String Builder Siehe StringBuilderEx.java Markus Reschke | Weitere Sprachfeatures | 5 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Printf System.in / out printf sind PrintWriter erlaubt formatierte Ausgabe Zwei Argumente: Den auszugebenden String mit Platzhaltern und die für diese einzusetzenden Werte Wichtigste Platzhalter: %d %f %n → Ganzzahl → Gleitkommazahl → Zeilenumbruch Formatierung von Zahlen möglich, z.B. %05.2f → Float mit 5 Stellen vor dem Komma mit führenden 0 bei Bedarf, sowie 2 Nachkommastellen Auch zum Erzeugen von Strings möglich, siehe java.util.Formatter Markus Reschke | Weitere Sprachfeatures | 6 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen String Builder Siehe Format.java Markus Reschke | Weitere Sprachfeatures | 7 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Motivation Manchmal hat man Typen mit einer begrenzten Anzahl von möglichen Werten Wochentage, Geldscheine, Positionen in einer GUI Realisierung früher oft als statische Konstanten in einer Klasse Markus Reschke | Weitere Sprachfeatures | 8 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Konstantenchaos Siehe NoEnums.java Markus Reschke | Weitere Sprachfeatures | 9 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Enums Aufzählungstypen Klassen mit einer begrenzten Anzahl von erstellen Objekten Können wie Klassen Methoden, Attribute und Konstruktoren haben Es können keine neuen Instanzen des Aufzählungstyp erstellt werden außer den vorher definierten Markus Reschke | Weitere Sprachfeatures | 10 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Enums Siehe WithEnums.java Markus Reschke | Weitere Sprachfeatures | 11 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Motivation Manchmal Objekte statt primitiven Datentypen nötig Collections, Generics Wrapper-Klassen speichern einen Wert vom primitiven Typ in einem Objekt Wrapperklassen: Byte Short Integer Long Float Double Character Boolean Void Immutable / Unveränderbar wie Strings Markus Reschke | Weitere Sprachfeatures | 12 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Enums Siehe Wrap.java Markus Reschke | Weitere Sprachfeatures | 13 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Autoboxing/unboxing Seit Java 5: Automatische Konvertierung zwischen Wrapper und primitivem Datentyp Markus Reschke | Weitere Sprachfeatures | 14 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Enums Siehe Box.java Markus Reschke | Weitere Sprachfeatures | 15 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Pakete Pakete fassen zusammengehörende Klassen zusammen Zusätzliche Möglichkeit zur Strukturierung von Programmen Stardmäßig liegen neue Klassen im Default-Paket Paketnamen bestehen aus mehreren Namensbestandteilen getrennt durch . z.B. name.markusreschke.plab Werden auf Verzeichnisstruktur abgebildet: name.markusreschke.plab → ./name/markusreschke/plab Klassen werden mit package Paketname; in der ersten Zeile einer .java-Datei einem und dem Ablegen im richtigen Verzeichnis einem Package zugeordnet Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Namen und Importe Jedes Programmelement hat einen vollständigen Namen Form meistens Paket . Klasse . Klassenelement java.util.ArrayList Vollständiger Name oft lang und daher unpraktisch zu verwenden Mit import Name; am Anfang einer .java-Datei können Klassen aus Paketen in den aktuellen Namensraum importiert werden. Dadurch reicht der Klassenname anstatt des vollständigen import Paketname.*; importiert alle Klassen des Pakets 1 2 1 2 3 4 5 import java . util . ArrayList ; import java . util .*; Mit import java . util . ArrayList ; ArrayList < Foo > = new ArrayList < >() ; statt java . util . ArrayList < Foo > = new java . util . ArrayList < >() ; Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Statischer Import Seit Java 5: Import von statischen Methoden aus Klassen möglich import static Paket.Klasse.Methode; Wildcard auch hier möglich import static Paket.Klasse.*; 1 2 1 2 3 4 5 import static java . lang . Math . sqrt ; import static java . lang . Math .*; Mit import static java . lang . Math . sqrt ; sqrt (5) ; statt Math . sqrt (5) ; Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Pakete Siehe Validation/ Markus Reschke | Weitere Sprachfeatures | 19 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Classpath Classpath gibt an, wo Java nach .class-Dateien suchen soll Angegebene Verzeichnisse sind jeweils das Default-Paket Enthält standardmäßig das aktuelle Verzeichnis Kann angepasst werden durch Setzen der CLASSPATH Umgebungsvariable z.B. CLASSPATH=.:/path/to/class/files/from/awesome/library Alternativ über -cp Schalter für java/javac z.B. java -cp .:/path/to/class/files/from/awesome/library Foo Markus Reschke | Weitere Sprachfeatures | 20 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Lokale Klassen Klasse definiert innerhalb einer anderen Klasse (äußere Klasse) Gehört zu einer Instanz der äußeren Klasse Definition wie normale Klasse Darf auf alle Elemente der äußeren Klasse zugreifen Aktuells Objekt der äußeren Klasse Outer.this Darf keine statischen Elemente haben Falls nach außen sichtbar, können neue Instanzen dort erzeugt werden mit outerObj.new Inner() Markus Reschke | Weitere Sprachfeatures | 21 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Beispiel: lokale Klassen Siehe Local.java Markus Reschke | Weitere Sprachfeatures | 22 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Statische Lokale Klassen Wie lokale Klassen definiert in einer anderen Klasse Assoziiert mit äußerer Klasse, nicht mit deren Objekten Dürfen nur auf statische Elemente der äußeren Klasse zugreifen Verhält sich ansonsten wie eine normale, nicht innere Klasse Zugriff aus Klasse von außen (falls erlaubt): 1 2 3 4 5 6 Outer.Inner public class Outer { public static class Inner { } } ... Outer . Inner i = new Outer . Inner () ; Markus Reschke | Weitere Sprachfeatures | 23 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Lokale Klassen in Methoden Lokale Klassen auch in Methoden erlaubt Auch hier Zugriff auf Elemente der äußeren Klasse erlaubt Falls Methode statisch: Zugriff nur auf statische Elemente Außerdem Zugriff auf mit final markierte lokale Variablen Markus Reschke | Weitere Sprachfeatures | 24 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Anonyme Klassen Klassen ohne Namen Werden von genau einem Interface oder einer Klasse abgeleitet Können dort definiert werden, wo auch new verwendet werden kann Verhalten sich ansonsten wie lokale Klassen Markus Reschke | Weitere Sprachfeatures | 25 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Beispiel: Anonye Klassen Siehe Anonym.java Markus Reschke | Weitere Sprachfeatures | 26 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Annotationen Fügen Metadaten zu Klassen hinzu Metadaten: Daten über Daten Form: @name Anwendbar auf: Klassen, Interfaces, Pakete, Methoden, Attribute (angegeben durch @Target bei Definition der Annotation) Können ausgewertet werden, um zusätzliche Funktionen realisieren ohne Ändern der Klassendefinition Entwerder zur Laufzeit, in der Class-Datei oder nur im Quellcode verfügbar (angegeben durch @Retention bei Definition der Annotation) Markus Reschke | Weitere Sprachfeatures | 27 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Annotations Vorgefertige Annotationen stellt sicher, dass Methoden andere überschreiben, sonst Kompilierfehler @Override erzeugt Warnungen beim Kompilieren, wenn damit annotierte Elemente verwendet werden @Deprecated 1 2 3 4 @Override // public fehlt , wird nicht ueber schriebe n String toString () { ... } Markus Reschke | Weitere Sprachfeatures | 28 Institut für Programmierung und Reaktive Systeme Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Anwendung von Annotationen Siehe Validation/ Markus Reschke | Weitere Sprachfeatures | 29 Institut für Programmierung und Reaktive Systeme Annotations Strings Printf Enums Wrapper-Klassen Pakete Classpath Verschachtelte Klassen Überblick und Ausblick String StringBuilder Wrapper Enums Pakete Classpath Lokale Klassen Anonyme Klassen Annotations Montag: Datenstrukturen Markus Reschke | Weitere Sprachfeatures | 30 Institut für Programmierung und Reaktive Systeme Annotations