Java14 kam heraus, also habe ich vorerst versucht aufzunehmen

Überblick

Java 14 ist raus. Es gibt verschiedene Änderungen und neue Funktionen, aber was Sie interessiert, ist der Datensatz, der als Vorschau enthalten war, oder? Richtig? Deshalb habe ich es sofort versucht.

wichtiger Punkt

record ist eine Funktion, die als Vorschau enthalten ist. Sie müssen sie daher mit einem Zauber verwenden.

java --enable-preview --source 14 RecordSample.java

Auch der hier geschriebene Inhalt kann sich in Zukunft ändern. (Weil es eine Vorschau ist)

Inhalt

Grundlegende Verwendung der Aufzeichnung

Wenn Sie record verwenden, wird automatisch eine Methode (Getter) generiert, um das zum Zeitpunkt der Definition angegebene Feld abzurufen.

public class RecordSample {
    public static void main(String[] args) {
        var person = new Person("Mario", 26);

        System.out.println(person.name());    // Mario
        System.out.println(person.age());     // 26
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {}

Der Punkt ist, dass die Definition von Datensatz sehr einfach ist. Außerdem kann der Code auf der Seite, die den Datensatz verwendet, genau wie eine herkömmliche Klasse geschrieben werden. Getter ist auch eine Methode mit demselben Namen wie das Feld, nicht getName (). Der Setter wird nicht generiert. Ich denke, es wäre schön zu entscheiden, ob auch ein Setter generiert werden soll, aber im Allgemeinen ist es besser, wenn das Objekt unveränderlich ist, also kann dies in Ordnung sein.

Durch die Verwendung von Datensatz werden außerdem automatisch String (), equals () und hashCode () überschrieben, die in der Object-Klasse definiert sind. Schauen wir uns jedes Beispiel an.

Beispiel für toString ()

public class ToStringSample {
    public static void main(String[] args) {
        var person = new Person("Mario", 26);

        System.out.println(person.toString());     // Person[name=Mario, age=26]
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {}

Es ist ein gutes Gefühl. Sie werden es nicht direkt verwenden, aber es ist nützlich beim Debuggen.

Beispiel für equals ()

public class EqualsSample {
    public static void main(String[] args) {
        var person1 = new Person("Mario", 26);
        var person2 = new Person("Mario", 26);

        System.out.println(person1.equals(person2));  // true

        person1 = new Person("Mario1", 26);
        person2 = new Person("Mario2", 26);

        System.out.println(person1.equals(person2));  // false

        person1 = new Person("Mario", 26);
        person2 = new Person("Mario", 27);

        System.out.println(person1.equals(person2));  // false
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {}

Dies ist der Fall, wenn verschiedene Objekte mit demselben Wert verglichen werden (oberes Beispiel), sodass Sie sehen können, dass sie die Feldwerte ordnungsgemäß vergleichen und nicht das ursprüngliche Verhalten der Object-Klasse. Ich habe verschiedene Werte für bestimmte Felder ausprobiert, aber natürlich ist es falsch.

Beispiel für hashCode ()

public class HashCodeSample {
    public static void main(String[] args) {
        var person1 = new Person("Mario", 26);
        var person2 = new Person("Mario", 26);

        System.out.println(person1.hashCode());  // -1997440586
        System.out.println(person2.hashCode());  // -1997440586
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {}

Dies ist auch der gleiche Wert in einem anderen Objekt mit dem gleichen Wert. Es wurde ordnungsgemäß überschrieben.

Konstruktorbeispiel

public class ConstructorSample {
    public static void main(String[] args) {
        new Person("Mario", -1);
        // Exception in thread "main" java.lang.IllegalArgumentException
        // at Person.<init>(ConstructorSample.java:11)
        // at ConstructorSample.main(ConstructorSample.java:3)
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {
    public Person {
        if(age < 0) {
            throw new IllegalArgumentException();
        }
    }
}

Es scheint, dass Sie auch einen Konstruktor definieren können. Sie haben keine Klammern. Nun, wenn es darum geht, Argumente zu schreiben, müssen Sie genau das Gleiche wie oben schreiben, aber wenn es Klammern ohne Argumente gibt, sieht es so aus, als gäbe es einen argumentlosen Konstruktor, also eine Notation ohne Klammern Es muss geworden sein. Ich denke es ist gut. Wenn der Zugriffsmodifikator nicht öffentlich ist, tritt ein Kompilierungsfehler auf.

Beispiel für die Definition eines anderen Felds oder einer anderen Methode

public class OtherMemberSample {
    public static void main(String[] args) {
        var person = new Person("Mario", 26);
        System.out.println(person.getGender());  // male
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {
    private static String gender = "male";

    public String getGender() {
        return gender;
    }
}

Ich weiß nicht, ob ich das jemals tun möchte, aber ich habe versucht, andere Felder und Methoden zu definieren. Es scheint, dass das Feld statisch sein muss, aber es scheint, dass es getan werden kann.

Ein Beispiel für die explizite Definition einer Methode, die automatisch überschrieben wird

public class ExplicitOverrideSample {
    public static void main(String[] args) {
        var person = new Person("Mario", 26);
        System.out.println(person.toString());      // overrided

        System.out.println(person.equals(person));  // false

        System.out.println(person.hashCode());      // -1
    }
}

//Definition der Aufzeichnung
record Person(String name, int age) {
    @Override
    public String toString() {
        return "overrided";
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return -1;
    }
}

Dies ist auch ein Beispiel dafür, wer so etwas tut, aber ich habe es versucht. Anscheinend ist es effektiver, es explizit zu schreiben.

Impressionen

Bitte werden Sie so schnell wie möglich eine formelle Funktion.

Referenzlink

Recommended Posts

Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert
Ich habe zum ersten Mal versucht, Docker zu berühren
Verwenden Sie vorerst eine externe Java-Bibliothek
Führen Sie jetzt Dataflow, Java, Streaming aus
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Ich habe das Java-Framework "Quarkus" ausprobiert.
Einführung in Java zum ersten Mal # 2
Ich habe Cassandras Object Mapper für Java ausprobiert
Java9 war enthalten, also habe ich jshell ausprobiert.
Ich habe das neue Yuan-Problem in Java ausprobiert
Zum ersten Mal Java lernen [Einführung]
Glassfish Tuning List, die ich vorerst behalten möchte
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
Installieren Sie vorerst Amazon Corretto (Vorschau)
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Versuchen Sie vorerst, Spring Cloud Config auszuführen
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Lernnotiz beim ersten Lernen von Java (persönliches Lernnotiz)
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Befehl, um Docker vorerst zu verwenden
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst
Java SE 13 (JSR388) wurde veröffentlicht, also habe ich es versucht
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Ich habe das FizzBuzz-Problem ausprobiert
[Java] Ich habe versucht, die Kombination zu implementieren.
Ich habe den Konstruktor (Java) studiert.
Ich habe versucht, Metaprogrammierung mit Java
[Memo] Führen Sie Node.js v4.4.5 vorerst unter CentOS 4.9 / RHEL4 (i386) aus (gcc-4.8 und glibc2.11 unter LinuxKernel 2.6.9).
[Lernaufzeichnung] Ich habe die aktuelle Zeit mit Ruby erhalten und für jedes Mal eine andere Begrüßung ausgegeben.
[Metall] Ich habe versucht, den Fluss bis zum Rendern mit Metall herauszufinden
Ich habe den Java-Test Level 2 bestanden und werde eine Notiz hinterlassen
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.
Seit ich Oracle Java Bronze bestanden habe, habe ich die Umrisse des Tests zusammengefasst.
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Spring Boot zum ersten Mal
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, die Methode zu erklären