#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 immutablebezpieczne wątkowo (z ang. thread safety)!

Leave a comment

Your email address will not be published.


*