Programmierung Ausgewahlte neue Funktionen in Java
Michael Goedicke
[email protected]
Entwicklung von Java
Die erste Java Version wurde von 1991 bis 1996 von James Gosling und weiteren entwickelt. Die Arbeiten fanden bei dem Unternehmen Sun Microsystems statt.
Seit 1998 wird die Weiterentwicklung von Java uber den Java Community Process (JCP) gesteuert. Neue Feature Anfragen werden mittels Java Specification Request (JSR) an den JCP gestellt.
Das Java Development Kit (JDK) und die Java virtual machine (JVM) wurden 2006 / 2007 als Open Source Software veroffentlicht.
Sun Microsystems wurde 2009 / 2010 von Oracle gekauft.
Seit Java 9 wird zwischen Long Term Support (LTS) welcher mehrere Jahre gilt und normalen Versionen (support fur halbes Jahr) unterschieden. Aktuelle Version ist Java 15 und die aktuelle LTS Version ist Java 11.
M. Goedicke ProgrammierungWiSe2020/2021 2
Java 8 Neue Moglichkeiten bei Interfaces
Mit dem Schlusselwort default wird bei einem Interface eine Methode mit Methodenrumpf ermoglicht.
Die default Methode kann nur auf die anderen abstrakten und default Methoden des Interfaces sowie auf die finalen Konstanten zugreifen. Die default Methode kann auch vererbt und in abgeleiteten Interfaces uberschrieben werden.
Neben der default Methode kann auch eine statische Methode in einem Interfaces implementiert werden. Diese Methoden werden uber den Interface Namen aufgerufen.
Das Schlusselwort default und static mussen vor dem Sichtbarkeitsmodifikator stehen.
M. Goedicke ProgrammierungWiSe2020/2021 3
Java 8 Interface default und static Beispiel
public interface Schneidbar {
double TOLERANZ_IN_PROZENT = 20.;
int getSchneidbareDicke();
default boolean istSchneidbar(int dickeBrett) { double maximaleDicke = getSchneidbareDicke() *
(1.+(TOLERANZ_IN_PROZENT / 100.)); return dickeBrett <= maximaleDicke;}static void nenneToleranzWert() { System.out.print(“TOLERANZ_IN_PROZENT”+” Prozent”);} }M. Goedicke ProgrammierungWiSe2020/2021 4 Java 8 Interface default und static Beispielpublic class Kreissaege implements Schneidbar{ private int schneidbareDicke;public Kreissaege(int schneidbareDicke) {this.schneidbareDicke = schneidbareDicke; }public static void main(String[] args) { Kreissaege kreissaege = new Kreissaege(10); if(kreissaege.istSchneidbar(13)) {System.out.println(“Brett ist schneidbar”); }else {System.out.print(“Brett ist dicker als “+kreissaege.getSchneidbareDicke()+” Millimenter inklusive Toleranz von: “); Schneidbar.nenneToleranzWert();} }public int getSchneidbareDicke() { return schneidbareDicke;} }M. Goedicke ProgrammierungWiSe2020/2021 5 Java 9 – Modularisierung Dekomposition eines Systems in abgeschlossene, aber verbundene Module Metadaten beschreiben das Modul und die Verbindung zu anderen Modulen Module erleichtern die Verstehbarkeit eines Systems, indem Implementierungsdetailshinter Schnittstellen strikt verborgen werden Kohasion: Sagt aus, wie eine Programmeinheit eine einzelne Aufgabe in sich selbsterfullt Starke Kohasion bedeutet, dass eine Programmeinheit fur eine abgegrenzte Aufgabe zustandigist Abhangigkeit von anderen Programmeinheiten wird dadurch reduziert Anderungen an Programmeinheiten ziehen seltener Anderungen an anderen Einheiten nachsich Einheit kann besser verstanden werden, ohne viele andere Einheiten ebenfalls verstehen zumussen Kopplung: Grad der Abhangigkeit einer Programmeinheit zu anderen Einheiten Lose Kopplung = kleine Schnittstelle zu anderen Einheiten Auch hier bestehen die Vorteile einer starken Kohasion Verwendung von Modulen fordert eine lose Kopplung bei hoher Kohasion der ModuleM. Goedicke Programmierung WiSe2020/2021 6 ModularisierungSchwache Kohasion + starke Kopplung Kernanforderungen an Module Strikte KapselungHohe Kohasion + lose Kopplung Es wird vor anderen Modulen verborgen, was nicht genutzt werden soll -> ungewollte Kopplung wird vermieden
Wohldefinierte Schnittstellen
Schnittstellen, die sich aufgrund schlechten Designs oft andern,
konnen anderen Code unbrauchbar machen Explizite Abhangigkeiten
Notwendig, um zuverlassige Konfiguration von Modulen zu erstellen M. Goedicke Programmierung WiSe2020/2021 7
Modularisierung vor Java 9
Groe Java-Projekte verwenden oft viele Bibliotheken
Verstehbarkeit von Quelltext steht im Zusammenhang mit der Menge
an verwendbaren Methoden und Klassen
Trotz Paketen kann Modularisierung in Java schwer sein:
Sichtbarkeit von Klassen
Wird definiert durch Pakete und Zugriffsmodifizierer
Wenn innerhalb eines Projektes Klassen paketubergreifend genutzt
werden mussen, sind diese zwingend auch global sichtbar Definition von Abhangigkeiten
Abhangigkeiten von Klassen uber import-Statement
Wird nur zur Compilezeit gepruft
Ob alle Abhangigkeiten zur Laufzeit im Classpath vorhanden sind,
wird vorher nicht sichergestellt
M. Goedicke Programmierung WiSe2020/2021 8
Modularisierung mit Java 9
Mit Projekt Jigsaw wurde ein echtes Modulsystem in Java eingefuhrt
Die JRE wird in Module aufgeteilt
Eigene Anwendungen konnen mit den gleichen Mechanismen
modularisiert werden
Erstellung eines Modulgraphen moglich
Modulepath ersetzt den Classpath
myModule
JDK 9 fuhrt neues Tool ein, um eine abgespeckte JRE zu erstellen, die nur die benotigten Module enthalt
M. Goedicke Programmierung WiSe2020/2021 9
Typinferenz fur lokale Variablen mit Java 10
Typinferenz, auch als Typableitung bezeichnet, lasst den Compiler den korrekten Typ der Variable ableiten
Mittels var kann ab Java 10 bei lokalen Variablen der Typ durch den Compiler abgeleitet werden:
var diesIstEinString = Hallo;
var soll die Lesbarkeit des Codes verbessern
Variable muss mit eindeutigem Typ initialisiert werden
Ausdrucke, die keinen eindeutigen Typ haben, konnen nicht mittels
var ausgeruckt werden. (Poly-Expressions)
Array-Initialisierer, Lambda-Ausdrucke und Methodenreferenzen sind
Beispiele fur Poly-Expressions.
Vorsicht bei Generics (Diamantoperator <> ohne Typ vermeiden) und
Zahlliteralen (wenn nicht explizit definiert wird var zu int), hier sollte
var mit Bedacht genutzt werden!
Vorsicht: Code-Review-Werkzeuge konnen mit var meist nicht
umgehen
M. Goedicke ProgrammierungWiSe2020/2021 10
Typinferenz fur lokale Variablen mit Java 10
Bessere Lesbarkeit des Code bereits bei kurzen Typbezeichnern
var paluno = new URL(https://paluno.uni-due.de); var connection = paluno.openConnection();
var reader = new BufferedReader(
new InputStreamReader(connection.getInputStream())); readFirstLines(reader);
Zuvor:
URL paluno = new URL(https://paluno.uni-due.de); URLConnection connection = paluno.openConnection(); Reader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream())); readFirstLines(reader);
M. Goedicke ProgrammierungWiSe2020/2021 11
Typinferenz fur lokale Variablen mit Java 10
Beispiel mit sehr unterschiedlich langen Typbezeichnern:
// ohne var
No no = new No();
AmountIncrease
new HorizontalLinePositionConnection(); Variable variable = new Constant(5); List
// mit var
var no = new No();
var more = new BigDecimalAmountIncrease();
var jumping = new HorizontalLinePositionConnection(); var variable = new Constant(5);
var names = List.of(Max, Maria);
M. Goedicke ProgrammierungWiSe2020/2021 12
Typinferenz fur lokale Variablen mit Java 10
Um die positiven Effekt von var effektiv zu nutzen sollten folgende
Richtlinien beachtet werden:
Gute Variablennamen wahlen und auf aussagekraftige Initialisierung
achten.
Geltungsbereich uberschaubar halten.
Die Chance fur mehr Zwischenvariablen nutzen.
Vorsicht bei Refactorings, wenn var zum Einsatz kommt
DieVerwendung von var im Entwicklungsteam absprechen und alle
verwendeten Entwicklungswerkzeuge in die Uberlegungen einbeziehen. var sollte nicht verwendet werden, wenn der Typ nicht klar erkennbar
ist:
var one = Arrays.asList(1, 2, 3).stream().findFirst().orElseGet(null);
M. Goedicke ProgrammierungWiSe2020/2021 13
Erweitertes Switch mit Java 12 & 13
Switch wurde um viele Funktionsmoglichkeiten erweitert
Ein case kann mehrere Falle behandeln
Pfeilsyntax verandert bekanntes Verhalten und ist analog zur
Lambdasyntax zu sehen. Kein fall-through
Anweisungsblocke
Neben dem switch-statement gibt es jetzt switch-expressions Switch-expression weit einer Variablen einen Wert zu
Semikolon am Ende zeigt den Status als Anweisung
yield gibt den Wert eines Falls zuruck.
M. Goedicke ProgrammierungWiSe2020/2021 14
Erweitertes Switch mit Java 12 & 13
Ein case kann mehrere Falle behandeln:
int x=5;
switch (x) { case 1,2,3,5,7,9:
System.out.println(ungerade);
break;
default:
System.out.println(gerade);
break; }
M. Goedicke ProgrammierungWiSe2020/2021 15
Erweitertes Switch mit Java 12 & 13
Pfeilsyntax lasst kein fall-through mehr zu. Es wird immer nur der zugehorige Fall behandelt.
Mittels Klammerung sind Anweisungsblocke moglich
int x = 5;
switch (x) {
case 1, 2, 3, 5, 7, 9 -> System.out.println(ungerade); default -> {
System.out.println(gerade);
System.out.println(Zweite Anweisung); }
}
M. Goedicke ProgrammierungWiSe2020/2021 16
Switch-Anweisung mit Java 12 & 13
Durch switch als Anweisung kann einer Variablen direkt das Ergebnis des zutreffenden switch-Falls zugewiesen werden
Semikolon am Ende zeigt den Status als Anweisung
yield gibt den Wert eines Falls zuruck. return ist nicht erlaubt. Alle Falle mussen abgedeckt sein, sonst Compiler-Fehler
default nicht notwendig, wenn alle Falle abgedeckt sind. Beispielsweise alle Falle eines Enums oder true/false fur boolean
String name = Jack;
int ergebnis = switch (name) { case Jack:
yield 3; case :
yield 0; case Testat:
yield 100; default:
throw new IllegalArgumentException(Falscher Wert: + name); };
M. Goedicke ProgrammierungWiSe2020/2021 17
Zusammenfassung Switch mit Java 12 & 13
Ein case kann mehrere kommagetrennte Werte abdecken
Die neue Pfeilsyntax folgt der Lambdasyntax Single-line statement oder Codeblock
Verhindert fall-through zum nachsten case
Beide Erweiterungen fur switch-Ausdruck und Anweisung nutzbar Switch jetzt auch als Anweisung
Berechnet einen Wert, der zugewiesen oder weitergegeben wird
Yield gibt den Wert eines Blocks zuruck
Return ist in Anweisung nicht erlaubt
Compiler pruft Falle auf Vollstandigkeit.
Switch-Anweisung ist Poly-Expression. D.h. var kann genutzt werden. Ist Ergebnistyp bekannt mussen alle Falle diesem Typ genugen. Ansonsten wird spezifischster Typ gewahlt, der alle Falltypen abdecken kann.
M. Goedicke ProgrammierungWiSe2020/2021 18
Reviews
There are no reviews yet.