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.
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)
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.
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.
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.
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.
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.
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.
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.
Bitte werden Sie so schnell wie möglich eine formelle Funktion.
Recommended Posts