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.
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)
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.
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.
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.
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.
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.
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.
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.
Veuillez devenir une fonction officielle dès que possible.