Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment

Aperçu

Java 14 est sorti. Il y a divers changements et nouvelles fonctionnalités, mais ce qui vous intéresse, c'est l'enregistrement qui a été inclus en aperçu, n'est-ce pas? Droite? C'est pourquoi je l'ai essayé immédiatement.

point important

record est une fonction incluse comme aperçu, vous devez donc l'utiliser avec un sort.

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

De plus, le contenu écrit ici est sujet à changement à l'avenir. (Parce que c'est un aperçu)

Contenu

Utilisation de base de l'enregistrement

Si vous utilisez record, une méthode (getter) pour obtenir le champ spécifié au moment de la définition est automatiquement générée.

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
    }
}

//définition de l'enregistrement
record Person(String name, int age) {}

Le fait est que la définition d'un enregistrement est très simple. En outre, le code du côté qui utilise record peut être écrit exactement comme une classe conventionnelle. De plus, getter sera une méthode portant le même nom que le champ, et non getName (). Le setter n'est pas généré. Je pense que ce serait bien de pouvoir choisir de générer également un setter, mais en général, il vaut mieux que l'objet soit immuable, donc cela peut être bien.

De plus, l'utilisation de record remplace automatiquement toString (), equals () et hashCode () définis dans la classe Object. Regardons chaque exemple.

Exemple de 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]
    }
}

//définition de l'enregistrement
record Person(String name, int age) {}

C'est un sentiment agréable. Vous ne l'utiliserez pas directement, mais c'est utile lors du débogage.

Exemple d'égalité ()

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
    }
}

//définition de l'enregistrement
record Person(String name, int age) {}

C'est vrai lorsque vous comparez différents objets avec la même valeur (exemple supérieur), vous pouvez donc voir qu'ils comparent correctement les valeurs de champ, et non le comportement d'origine de la classe Object. J'ai essayé différentes valeurs pour des champs spécifiques, mais bien sûr, c'est faux.

Exemple de 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
    }
}

//définition de l'enregistrement
record Person(String name, int age) {}

C'est également la même valeur dans un autre objet avec la même valeur. Il a été annulé correctement.

Exemple de constructeur

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)
    }
}

//définition de l'enregistrement
record Person(String name, int age) {
    public Person {
        if(age < 0) {
            throw new IllegalArgumentException();
        }
    }
}

Il semble que vous puissiez également définir un constructeur. Vous n'avez pas de parenthèses. Eh bien, quand il s'agit d'écrire des arguments, vous devez écrire exactement la même chose que ci-dessus, mais s'il y a des parenthèses sans arguments, il semble qu'il y ait un constructeur sans argument, donc une notation sans parenthèses Cela doit être devenu. Je pense que c'est bien. De plus, si le modificateur d'accès n'est pas public, une erreur de compilation se produira.

Exemple de définition d'un autre champ ou méthode

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

//définition de l'enregistrement
record Person(String name, int age) {
    private static String gender = "male";

    public String getGender() {
        return gender;
    }
}

Je ne sais pas si je veux faire ça, mais j'ai essayé de définir d'autres champs et méthodes. Il semble que le champ doit être statique, mais il semble que cela puisse être fait.

Un exemple de définition explicite d'une méthode qui est automatiquement remplacée

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
    }
}

//définition de l'enregistrement
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;
    }
}

C'est aussi un exemple de qui fait une telle chose, mais je l'ai essayé. Apparemment, il est plus efficace de l'écrire explicitement.

Impressions

Veuillez devenir une fonction officielle dès que possible.

Lien de référence

Recommended Posts

Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
Java12 est sorti, alors j'ai essayé l'expression switch pour le moment
J'ai essayé de toucher Docker pour la première fois
Utilisez une bibliothèque Java externe pour le moment
Exécutez Dataflow, Java, Streaming pour le moment
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
J'ai essayé le framework Java "Quarkus"
Introduction à Java pour la première fois # 2
J'ai essayé le mappeur d'objets de Cassandra pour Java
Java9 était inclus, j'ai donc essayé jshell.
J'ai essayé le nouveau yuan à Java
Apprendre pour la première fois java [Introduction]
Liste de réglages de Glassfish que je souhaite conserver pour le moment
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment
Installez Amazon Corretto (préversion) pour le moment
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle
J'ai essayé d'utiliser la boîte à outils de migration pour les fichiers binaires d'application
Apprentissage pour la première fois des expressions et opérateurs Java # 3
Essayez d'exécuter Spring Cloud Config pour le moment
J'ai essayé d'utiliser l'instruction Extended for en Java
Mémo d'apprentissage lors de l'apprentissage de Java pour la première fois (mémo d'apprentissage personnel)
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
Commande pour essayer d'utiliser Docker pour le moment
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai fini de regarder les roses de Versailles, alors j'ai essayé de reproduire la chanson de fin en Java
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
Hello World avec la bibliothèque d'extension Ruby pour le moment
Java SE 13 (JSR388) est sorti alors je l'ai essayé
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
J'ai essayé le problème FizzBuzz
[Java] J'ai essayé d'implémenter la combinaison.
J'ai étudié le constructeur (java)
J'ai essayé la métaprogrammation avec Java
[Memo] Exécutez Node.js v4.4.5 sur CentOS 4.9 / RHEL4 (i386) pour le moment (gcc-4.8 et glibc2.11 sur LinuxKernel 2.6.9)
[Enregistrement d'apprentissage] J'ai obtenu l'heure actuelle avec Ruby et j'ai sorti un message d'accueil différent à chaque fois.
[Metal] J'ai essayé de comprendre le flux jusqu'au rendu avec Metal
J'ai réussi le test Java niveau 2, je vais donc laisser une note
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"
Depuis que j'ai réussi l'Oracle Java Bronze, j'ai résumé les grandes lignes du test.
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
Spring Boot pour la première fois
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai essayé d'expliquer la méthode