Java 14 kommt



Laut Oracle ist die Veröffentlichung von Java 14 für den 17. März geplant. Ich frage mich, ob das Erscheinungsdatum mit dem St. Patrick's Day zusammenhängt (der an diesem Tag gefeiert wird) oder nicht, wir werden es sehr bald herausfinden. Schauen wir uns die Innovationen an, die im neuen Java verfügbar sein werden, und entscheiden wir, ob wir aus Freude oder Trauer Bier trinken.

Aufzeichnungen


Eine grundlegend neue Sprachfunktion, die im Vorschaumodus in Java 14 verfügbar ist. Das Hauptziel besteht darin, viele Fadennudeln im Code zu entfernen. Datensätze sollten Klassen ersetzen, die nur zum Speichern von Daten in Feldern ohne beschriebenes Verhalten verwendet werden. Definieren Sie Record , und der Compiler selbst generiert die Methoden constructor, getters, equals () und hashCode (), toString (). Irgendwo haben wir es schon gesehen, richtig, Mr. Lombok? Der Eintrag lautet wie folgt:

public record Person(String name, int age){}

Um Record zu kompilieren , müssen Sie jdk14 herunterladen und den folgenden Befehl eingeben:

javac —enable-preview —release 14 Person.java

Wir dekompilieren und sehen, was der Compiler getan hat:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(java.lang.String name, int age) { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.String name() { /* compiled code */ }

    public int age() { /* compiled code */ }
}

Anstelle von Record haben wir also eine letzte Klasse , die von der neuen abstrakten Record- Klasse erbt . Und wie erwartet haben wir die generierten Getter, Konstruktor, equals (), hashCode (), toString () erhalten . Beachten Sie, dass alle Felder als endgültig markiert sind , was bedeutet, dass wir sie nicht neu definieren können. Die Aufzeichnung selbst ist jedoch nicht vollständig unverändert, da In Feldern gespeicherte Objekte können veränderbar sein. Eine ausführliche Beschreibung von Record finden Sie hier .

Talkative NullPointerExceptions


Freundlicher werden NullPointerExceptions sein . Nein, der Compiler weiß immer noch nicht, wie er NPE für uns reparieren soll , aber jetzt wird die Beschreibung der Ausnahme informativer. Wir simulieren die Situation: Wir rufen NPE in Java 11 und Java 14 auf. Zum Beispiel haben wir eine komplexe Zusammensetzung, die typisch für Entity ist , und um die Daten zu erhalten, müssen wir mehrere Objekte von der Quelle aufrufen, um zum gewünschten Feld zu gelangen, und so:

var street = message.getAuthor().getAddress().getStreet();

In Java 11 erhalten wir ein altes bekanntes Fehlerprotokoll, das die Hauptfrage hinterlässt: Wer ist null? Nachricht, Autor, Adresse?

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)

So führen Sie auf Java 14, müssen Sie die Klasse in der gleichen Weise wie kompilieren Rekord über:

javac —enable-preview —release 14 Main.java

Und führen Sie durch Hinzufügen eines speziellen Flags aus:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main

Als Ergebnis der Ausführung erhalten wir die folgende Ausgabe:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)

Wie wir sehen können, ist die Nachricht informativer geworden und wir können sehen, wo genau in der Anrufkette NPE aufgetreten ist .

Textblöcke


In Java 13 eingeführte Textblöcke sind auch in Java 14 als Vorschaufunktion verfügbar. Ich möchte Sie daran erinnern, dass ihre Hauptaufgabe darin besteht, die Arbeit mit mehrzeiligen Literalen zu vereinfachen. Eine sehr praktische Funktion zum Schreiben von SQL-Abfragen, HTML-Code und JSON . Ich denke, dies ist eine der Funktionen, die sehr nützlich sein werden. Erinnern Sie sich an die Syntax. Zum Beispiel müssen wir eine SQL-Abfrage schreiben . Vor Java 13 verwendeten wir die Zeichenfolgenverkettung, um eine lesbare Abfrage zu schreiben, und die Abfrage sah ungefähr so ​​aus:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";

Ab Java 13 können wir einen Textblock verwenden, indem wir eine Zeile zwischen dreifachen doppelten Anführungszeichen wie folgt schreiben:


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;

Java 14 fügt zwei neue Trennzeichen hinzu, die in Textblöcken verwendet werden können. Das erste ist ein einzelnes Leerzeichen: \ s . Das zweite ist das Zeilenumbruchzeichen: \ .

Ausdrücke wechseln


Ab Java 14 werden Switch-Ausdrücke von einer Vorschau-Funktion zu einer vollständigen Funktion verschoben. Erinnern wir uns kurz an die Funktionen des neuen Operators:

  • Lambda-Syntax
  • Möglichkeit, mehr als einen Ausdruck in einem Fall zu verwenden
  • Fehlerausgabe bei unvollständiger Abdeckung des Satzes möglicher switch () -Werte . Mit anderen Worten, wenn Sie eine Aufzählung verwenden:

    public enum  Car {
        NIVA, NEXIA, KIA
    }

    Wenn Sie switch () wie folgt schreiben , gibt der Compiler einen Fehler aus, der besagt, dass nicht alle möglichen Fälle aus der Aufzählung aufgelistet sind:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • Die Fähigkeit, einen Wert zurückzugeben:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };


Mustervergleich


Pattern Matching ist eine neue Vorschau-Funktion, die in Java 14 verfügbar ist. Es wurde viel darüber gesprochen, viele haben darauf gewartet, und hier ist es. Ziel ist es, die Objekttypprüfung und ihre Konvertierung in der Instanz des Operators zu kombinieren . Mit anderen Worten, vor Java 14 würden wir so schreiben:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

Jene. Um die Methoden der Klasse zu verwenden, die das Objekt ist, müssen Sie es in diese Klasse umwandeln. Ab Java 14 steht eine neue Syntax zur Verfügung, in der instanceof die Funktionen Validierung und Konvertierung kombiniert:

Object obj = "Igor";

if (obj instanceof String s){
    System.out.println(s.length());
}

Fazit


Java entwickelt sich weiter und erleichtert gewöhnlichen Entwicklern das Leben. Neue Funktionen sollen den Code sauberer, das Leben einfacher und die Gehälter höher machen. Was denkst du, welche der neuen Funktionen wird die Liebe der Community gewinnen?

All Articles