Публикация

Java Record. Где наследование?

Используете ли вы Record классы? Или же вы принципиально игнорируете существования Record классов по причине отсутствия наследования. Тут хочу немного приоткрыть занавес и пояснить, куда делось наследование.

Долгое время мы использовали Lombok и его прекрасные аннотации. Давайте посмотрим, как это выглядело:

@Getter
@Setter
public class UserRegistration {
    private String email;
    private String password;
}

С выходом Java 14 мы увидели впервые Record классы:

record UserRegistration(String email, String password)

И если сравнить, то уже это выглядит приятней и ярче, чем Lombok, не говоря уже о традиционном описании POJO со всеми его методами и конструкторами.

Важно понимать, что record не выкинет Lombok из проектов и даже не составит ему конкуренцию. Почему, и для чего нужен Record класс пойдет речь ниже.

Мотивация Record классов

Что мы знаем о Record классах? То, что теперь мы пишем меньше шаблонного кода, и наши POJO выглядят красиво и коротко, а также, что теперь мы не имеем наследования 🤫.

Это все очень сжато и коротко, но это основная суть, которую покрывают во всех публикациях о Java 14 Records.

Но основная мотивация Record классов немного другая на мое мнение. Если посмотреть на описание JEP 395 Records мы увидим основной посыл.

Record - класс, который являются прозрачным отображением неизменяемых данных.

Следуя этому, когда мы создаем новый record мы явно сообщаем компилятору, что этот класс отображает неизменяемые данные нашей сущности. А то, что record класс снимает с вас кучу шаблонного кода является следствие идеологии этих классов, не нуждающихся во множестве того самого шаблонного мусора.

И тут важно понимать, что применять record классы нужно только тогда, когда ваша задумка и дизайн соответствуют описанию вышесказанного о неизменяемости и прозрачности данных.

Игнорируя это, и мотивируясь красотой отсутствия шаблонного когда, когда это не накладывается на вашу модель, вы можете лишь сделать хуже расширяемости вашего кода в будущем.

Наследование Record классов

Чтобы пояснить отсутствие возможности наследоваться, я хочу, вернуться к примеру, приведенного кода выше:

record UserRegistration(String email, String password)

Теперь давайте скомпилируем этот код, и посмотрим, какой код был сгенерирован впоследствии:

javac --enable-preview -source 14 UserRegistration.java
javap -p UserRegistration

После выполнение второй команды мы увидим тот код, который был сгенерирован для UserRegistration класса:

Compiled from "UserRegistration.java"
public final class UserRegistration extends java.lang.Record {
  private final String email;
  private final String password;
  public UserRegistration(String, String);
  public java.lang.String toString();
  public final int hashCode();
  public final boolean equals(java.lang.Object);
  public String email();
  public String password();
}

Как мы можем видеть, Record класс это привычный нам класс, который уже наследуется от абстрактного класса java.lang.Record.

В первую очередь это и есть причиной отсутствия наследования, так как в Java нет множественного наследования.

Также, он помечен как final, что также значит, отсутствие возможности наследоваться от него. В свою очередь мы легко можем реализовываться любые интерфейсы в нашем record классе.

Следуя со всего вышерассмотренного, ответом есть то, что Record классы не есть полной заменой всех ваших POJO, руководствоваться нужно тем, что создаваемый record есть прозрачным и неизменяемым отображением сущности.

И помним, что никто не отменял привычные нами классы. Нужна сложная структура данных с наследованием, тогда record классы не ваш путь. Хотим отобразить продукт или информацию о пациенте, для предоставления через API, не усложняя вложенным деревом наследования, тогда вперед использовать record классы.

Опубликовано: 9 июня 2021 г.Просмотров: 56

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔