Homepage von Basti1012 = ,Hauptmenü
Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung

Bild: Shutterstock

In Version 14 der alteingesessenen Programmiersprache wurden mehr Java Enhancement Proposals berücksichtigt als je zuvor. Der Großteil der Neuerungen zielt auf eine Sache ab: Java-Entwicklern das Coden zu erleichtern.

Java ist eine objektorientierte Programmiersprache. Die klassenbasierte Sprache wurde 1995 von Sun Microsystems entwickelt, das Unternehmen wurde 2010 von Oracle aufgekauft. Der 14. Release der Programmiersprache kommt mit Switch-Expressions, Pattern-Matching für instanceof und NullPointerExceptions.

Switch-Expressions

In Java 12 und 13 waren Switch-Expressions bereits als Preview-Feature verfügbar. Vor der Neuerung musstet ihr Switches als Statements schreiben; sie als Expression auszudrücken, war nicht möglich.

Der Unterschied zwischen Statement und Expression?

Folgender Code ist ein Beispiel für ein Statement:

String message = "";
if (condition) {
message = "Hello!";
}
else {
message = "Welcome!";
}

Dasselbe mithilfe des Ternary-Operators ausgedrückt, ist eine Expression:

String message = condition ? "Hello!" : "Welcome!";

Durch die Neuerung sollen verschiedene Fehlerquellen eliminiert werden.

Einen Switch konntet ihr in Java bislang ausschließlich in Form eines Statements ausdrücken:

switch (event) {
case PLAY:
System.out.println("PLAY event!")
break;
case STOP:
System.out.println("STOP event")
break;
default:
System.out.println("Unknown event");
}

Über das break-Statement wird im oben stehenden Code sichergestellt, dass der nächste Block innerhalb des Switch-Statements entsprechend nicht ausgeführt wird. Ohne das break-Statement würde der jeweils nächste Block innerhalb des Statements ausgeführt werden. Dieses Verhalten innerhalb eines Switch-Statements wird auch fall-through-behavior genannt.

Switch-Expressions sind weniger umfangreich, der Zweck des Codes ist klarer ersichtlich und mit ihnen braucht ihr das break-Statement nicht mehr.

var log = switch (event) {
case PLAY -> "User has triggered the play button";
case STOP ->"User needs a break";
default -> "No event to log";
};

Die neue switch-Syntax ist an die lambda-ähnliche Syntax angelehnt, die mit Version 8 Eingang in Java fand: Label -> Code, der einen Wert zurückgibt. Ähnlich wie in einer Lambda-Expression ist es möglich, einzeilige Ausdrücke und Codeblöcke in geschwungenen Klammern innerhalb eines switch-Statements gemeinsam verwenden.

switch (event) {
case PLAY -> {
System.out.println("PLAY event!");
counter++;
}
case STOP -> System.out.println("STOP event");
default -> System.out.println("Unknown event");
};

Außerdem könnt ihr jetzt mehrere Labels für einen Case nutzen:

switch (event) {
case PLAY ->
System.out.println("User has triggered the play button");
case STOP, PAUSE ->
System.out.println("User needs to relax");
};

Vor den neuen Switch-Expressions konnte dasselbe Resultat über das Fallthrough-Verhalten erreicht werden, indem das break-Statement zwischen case STOP und case PAUSE einfach weggelassen wurde:

switch (event) {
case PLAY:
System.out.println("User has triggered the play button");
break;
case STOP:
case PAUSE:
System.out.println("User needs to relax");
break;
}

Dabei ist aber aus dem Code nicht ersichtlich, ob das break-Statement mit Absicht fehlt oder nicht. Die Fälle STOP und PAUSE wie in Beispiel 4 zusammenfassen zu können, bringt eben diese Klarheit und reduziert so die Fehleranfälligkeit. Ein weiterer Vorteil des neuen Switches tritt zutage, wenn ihr switch mit einem enum-Type nutzt:

public enum Event {
PLAY, PAUSE, STOP
}

Der Compiler überprüft jetzt, ob es für jeden möglichen Wert ein passendes switch-Label gibt. Wenn nicht, wirft euer Programm folgende Fehlermeldung:

error: the switch expression does not cover all possible input values.

Text-Blöcke

Auch Text-Blöcke waren in Java 13 bereits als Preview-Feature verfügbar. Die Neuerung soll die Arbeit mit mehrzeiligen String-Literals vereinfachen. In V 14 durchläuft das Feature eine weitere Test-Runde, kommt allerdings mit einigen kleineren Anpassungen. Um mehrzeiligen Text zu formatieren, wurden in Java bislang typischerweise String-Verkettungen und Umbrüche genutzt:

String html = "" +"\n\t" + "" +
"\n\t\t" + "

\"Java 14 is here!\"

" +
"\n\t" + "" +
"\n" + "";

Dank der neuen Schreibweise mit den ??? jeweils am Anfang und am Ende eines Blocks könnt ihr die Verkettungen und Umbrüche in Zukunft weglassen.

String html = """

"Java 14 is here!"

""";

Außerdem wurden in Java 14 zwei neue Escape-Sequenzen hinzugefügt. Zum einen die \s Schreibweise für ein einzelnes Leerzeichen. Zum anderen ein Backslash \ für eine neue Zeile innerhalb eines mehrzeiligen Strings.

String literal =
"Lorem ipsum dolor sit amet, consectetur adipiscing " +
"elit, sed do eiusmod tempor incididunt ut labore " +
"et dolore magna aliqua.";

Kann zukünftig so geschrieben werden:

String text = """
Lorem ipsum dolor sit amet, consectetur adipiscing \
elit, sed do eiusmod tempor incididunt ut labore \
et dolore magna aliqua.\
""";

Pattern-Matching für instanceof

Pattern-Matching ist in Java 14 in Form eines Preview-Features verfügbar. Nach instanceof-Conditionals brauchte man bislang einen sogenannten expliziten Cast. Type-Casting in Java bezeichnet den Vorgang, einen Value von einem Datentyp an einen anderen zu deklarieren. Es gibt zwei verschiedene Arten von Type-Conversion in Java: explizites und automatisches Casting. Einen Überblick darüber, was das genau bedeutet, findet ihr in diesem Artikel. Mit dem neuen Pattern-Matching-Feature wird der explizite Cast für instanceof-Conditionals obsolet. Bisher musstet ihr folgenden Code schreiben:

if (obj instanceof Group) {
Group group = (Group) obj; [code]// use group specific methods
var entries = group.getEntries();
}

Bei aktiviertem Feature geht das zukünftig so:

if (obj instanceof Group group) {
var entries = group.getEntries();
}

Die kürzere Syntax soll die Fehleranfälligkeit eurer Java-Programme reduzieren.

Records

Ein weiteres Preview-Feature in Java 14 sind Records. Ähnlich wie die anderen Neuerungen in V 14 zielt auch dieses Feature darauf ab, eurem Java-Code die unnötige Komplexität zu nehmen und ihn präziser zu machen. Bei Records geht es darum, Domain-Klassen, deren einziger Zweck es ist, Daten in Fields zu speichern, zukünftig weniger wortreich aufschreiben zu können. Ein Beispiel seht ihr hier:

public class BankTransaction {
private final LocalDate date;
private final double amount;
private final String description;

public BankTransaction(final LocalDate date,
final double amount,
final String description) {
this.date = date;
this.amount = amount;
this.description = description;
}

public LocalDate date() {
return date;
}

public double amount() {
return amount;
}

public String description() {
return description;
}

@Override
public String toString() {
return "BankTransaction{" +
"date=" + date +
", amount=" + amount +
", description='" + description + '\'' +
'}';
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BankTransaction that = (BankTransaction) o;
return Double.compare(that.amount, amount) == 0 &&
date.equals(that.date) &&
description.equals(that.description);
}

@Override
public int hashCode() {
return Objects.hash(date, amount, description);
}
}

Daraus wird folgender Code:

public record BankTransaction(Date date,
double amount,
String description) {}

Tiefer ins Thema Records einsteigen könnt ihr zum Beispiel in diesem Blogpost.

NullPointerExceptions

In Java 14 gibt es ein neues JVM-Feature, über das ihr zukünftig weitere Informationen über die Ursache von sogenannten NullPointerExceptions bekommt. Das Feature soll für Methoden, Fields, Arrays und Assignments gleichermaßen funktionieren. Details dazu erfahrt ihr im offiziellen Oracle-Blogpost zum neuen Java-Release.

Vielleicht ebenfalls interessant für dich: 



MySQL Storage Engine Vergleich – Warum MyISAM?

Neuerdings ist InnoDB die Standard-Engine von MySQL, was ich echt vernünftig finde. Ich finde es erstaunlich, wie sich MyISAM so lange halten konnte und würde gern verstehen, warum. Meiner Meinung nach zeichnet die Verbreitung von MyISAM ein trauriges Bild für Webanwendungen im Allgemeinen. Foreign Keys sind ein Segen! Deshalb die gewagte Aussage: Webanwendungen werden oft als wilder Hack hingeschustert, weswegen auch auf Datenbankseite keine vernünftige Integrität gebraucht wird.

Anders kann ich mir jedenfalls nicht erklären, wie es MyISAM zu solch einer hohen Verbreitung geschafft hat. Nachfolgend führe ich nochmal eine kleine (von mir kommentierte) Gegenüberstellung auf, die die wichtigsten Unterscheidungsmerkmale umfasst:

MyISAM

  • Die Daten-Speicherung in little endian soll für eine Maschinenunabhängigkeit / Betriebssystemunabhängigkeit sorgen – Ich weiß nicht, in wiefern das im Webumfeld praxisrelevant ist (LAMP als Standard-Stack). Kommentare hierzu erwünscht!
  • NULL-Werte sind in indizierten Spalten zulässig
  • MyISAM unterstützt FULLTEXT-Indizes, Blobs und Text-Columns sind indizierbar – Praktisch!
  • Die Höchstlänge für Schlüssel beträgt 1000 Bytes (kann aber durch ein rekompilieren beliebig angepasst werden)
  • eine MyISAM-Tabelle kann maximal 64 Indizes haben – sollte reichen, wer mehr braucht hat oft beim Design was falsch gemacht.
  • Pro Index dürfen es bis zu 16 Spalten sein
  • Jede Tabelle wird getrennt gespeichert: Das Manual sagt dazu:

    Jede MyISAM-Tabelle wird in drei Dateien auf der Festplatte gespeichert. Die Namen der Dateien beginnen mit dem Tabellennamen und haben eine Erweiterung, die den Dateityp angibt. Eine .frm-Datei speichert das Tabellenformat. Die Datendatei besitzt die Erweiterung .MYD (MYData). Die Indexdatei hat die Erweiterung .MYI (MYIndex).

  • Wohl das wichtigste Unterscheidungsmerkmal: MyISAM arbeitet mit Table-Locking. Das ist beim Lesen schneller als das Row-Locking von InnoDB, wird aber bei parallelen Reads/Writes die Schreibvorgänge verzögern. Siehe dazu: Erzeuger-Verbraucher-Problem.

InnoDB

  • Man liest – verglichen mit MyISAM – oft von einer sichereren Recovery im Fall eines Crashes
  • Referentielle Integrität durch Foreign-Key-Unterstützung. Für mich DAS Feature.
  • Transaktionen. In ernstgemeinten, kritischen Anwendungen geht es nicht ohne.
  • Das Manual sagt zur Serverauslastung:

    InnoDB has been designed for maximum performance when processing large data volumes. Its CPU efficiency is probably not matched by any other disk-based relational database engine.

Vielleicht habe ich ein Killer-Argument für MyISAM übersehen? Und was spricht eigentlich gegen eine gemischte Verwendung von MyISAM / InnoDB in der selben Datenbank je nach jeweiliger Anforderung an eine Tabelle?

Umwetter Warnumgen und Wetter vorschau