JDK 16 Releases
jdk.java.net
Java 16 ist jetzt offiziell released
Records und Pattern Matching für instanceof
record Person(Date birthday, String givenName, String familyName) {}
class PersonClass {
private final Date birthday;
private final String givenName;
private final String familyName;
PersonClass(Date birthday, String givenName, String familyName) {
this.birthday = birthday;
this.givenName = givenName;
this.familyName = familyName;
}
public Date getBirthday() {
return birthday;
}
public String getGivenName() {
return givenName;
}
public String getFamilyName() {
return familyName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonClass that = (PersonClass) o;
return Objects.equals(birthday, that.birthday) && Objects.equals(givenName, that.givenName) && Objects.equals(familyName, that.familyName);
}
@Override
public int hashCode() {
return Objects.hash(birthday, givenName, familyName);
}
@Override
public String toString() {
return "PersonClass{" +
"birthday=" + birthday +
", givenName='" + givenName + '\'' +
", familyName='" + familyName + '\'' +
'}';
}
}
Weniger Tipparbeit. Ist wie die data class bei Kotlin.Ich habe mir die Records durchgelesen und trotzdem nicht Verstanden was das jetzt für einen Vorteil bringt gegenüber einer normalen Klasse.
Weniger Code und garantierte Immutability.Ich habe mir die Records durchgelesen und trotzdem nicht Verstanden was das jetzt für einen Vorteil bringt gegenüber einer normalen Klasse.
Auch werden equals/hashcode/toString automatisch generiert.Weniger Code und garantierte Immutability.
Du hast hier sealed interfaces und somit kannst du bestimmen, welche Implementierungen es gibt und da baut pattern matching drauf auf.Was ist das?
Was kann man damit machen?
Davon habe ich noch nie gehört, was soll das sein?
switch(o) {
case (Impl1 i) -> i.doStuffi1(); break;
case (Impl2 i) -> i2.doStuff(); break;
// ...
}
if (o instanceof String) {
String s = (String) o;
// ...
}
if (o instanceof String s) {
// do stuff with s as String
}
Object a = new IllegalStateException();
if (a instanceof IllegalStateException) {
IllegalThreadStateException e = (IllegalThreadStateException)a;
}
Impossible cast from IllegalStateException to IllegalThreadStateException in klasse.main(String[]) [Scary(9), High confidence] SpotBugs Problem (Scary)
Java:record Person(Date birthday, String givenName, String familyName) {}
Den kanonischen Konstruktor kann man "überschreiben", und Methode kann man ganz normal anlegen:Wie siehts eigentlich aus wenn ich später feststelle, daß "Person" doch etwas mehr können muß als bloß drei Variablen zu bündeln? Z.B. wenn ich irgendwann mal das Geburtsdatum auf Plausibilität prüfen will?
record Person(Date birthday, String givenName, String familyName) {
Person(Date birthday, String givenName, String familyName) {
this.givenName = givenName;
//...
}
int getAge() {
return 42;
}
}