#Java 14 – Record
#Java 14 – Record
W 14 wersji Javy wprowadzono mechanizm który pozwala unikać tzw. „boilerplate code„. Mechanizm ten to nowy typ klasy – Record. Tym nadmiarowym kodem są metody takie jak: getters & setters, konstruktory, metody equals, hashcode i metoda toString.
Poniżej kod przykładowej klasy Employee – zauważyć można dużo nadmiarowego kodu:
public class Employee { private String name; private String surname; private String email; public Employee(String name, String surname, String email) { this.name = name; this.surname = surname; this.email = email; } public String getEmail() { return email; } public String getName() { return name; } public String getSurname() { return surname; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", surname='" + surname + '\'' + ", email='" + email + '\'' + '}'; } // equals() & hashCode() }
Powyższy kod można w Java 14 skrócić do postaci:
public record EmployeeRecord(String name, String surname, String email) {}
W wersji IntelliJ IDEA niższej niż wydanie z roku 2020 należy dodać niezbędną konfigurację do projektu który oparty jest o Mavena:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <release>14</release> <compilerArgs> <arg>--enable-preview</arg> </compilerArgs> <forceJavacCompilerUse>true</forceJavacCompilerUse> <parameters>true</parameters> </configuration> </plugin> </plugins> </build>
oraz:
Run -> Edit Configurations -> VM options:
--enable-preview
Klasa uruchomieniowa – DemoRecord:
public class DemoRecord { public static void main(String[] args) { EmployeeRecord employeeRecord = new EmployeeRecord("Java", "Leader.pl", "kontakt@JavaLeader.pl"); System.out.println(employeeRecord); System.out.println(employeeRecord.name()); System.out.println(employeeRecord.surname()); System.out.println(employeeRecord.email()); } }
wynik:
EmployeeRecord[name=Java, surname=Leader.pl, email=kontakt@JavaLeader.pl] Java Leader.pl kontakt@JavaLeader.pl
można zauważyć, że dostęp do atrybutów klasy odbywa się poprzez użycie metod bez przedrostka get, nie ma metod typu set ponieważ nie można modyfikować ich zawartości – są domyślnie prywatne i niemutowalne, ustawiane w konstruktorze. Ponadto:
- Rekord jest klasą finalną po której nie można dziedziczyć,
- Rekordy nie mogą być abstrakcyjne,
- Domyślnie klasa typu Record dziedziczy po klasie java.lang.Record,
- Klasy typu Record mogą implementować interfejsy,
- W klasach typu Record można używać adnotacji.
Projekt Record nie został wprowadzony po to żeby zastąpić znanego Lomboka. Lombok jest bardziej elastyczny a obiekty klas tworzonych za pomocą Lomboka są modyfikowalne. Pamiętajmy jednak, że obiektu typu immutable są bezpieczne wątkowo (z ang. thread safety)!
Leave a comment