Java Record Classes: A Beginner's Guide

Привет, будущие разработчики Java! Сегодня мы рассмотрим захватывающую функцию, введенную в Java 14: Record Classes. Не волнуйтесь, если вы новичок в программировании – я веду вас по этой концепции шаг за шагом, как я делал это для многих студентов в течение многих лет своей преподавательской деятельности. Так что возьмите чашечку вашего любимого напитка, и погружемся в эту тему!

Java - Record Classes

Что такое Java Record?

Представьте себе, что вы собираете бейсболистские карты. Каждая карта содержит конкретную информацию: имя игрока, команда и средний показатель отбивания. В Java мы часто создаем классы для хранения такого рода данных. Record – это особый тип класса, предназначенный для этого – хранения данных – но с гораздо меньшим количеством кода по сравнению с традиционными классами.

Цель Java Record

Основная цель Java Record – упростить создание классов, которые в основном используются для хранения данных. Это как иметь помощника в кухне, который подготовит все ингредиенты, прежде чем вы начнете готовить – Records подготавливают ваши данные, чтобы вы могли сосредоточиться на их использовании в вашей программе.

Особенности Java Record

Давайте рассмотрим, что делает Records особенными:

  1. Краткая синтаксис: Пишите меньше, делайте больше!
  2. Непреходящесть: После создания данные не могут быть изменены.
  3. Автоматические методы: Java создает общие методы для вас.
  4. Прозрачность: Что вы видите, то получаете – без скрытых полей.

Пример без использования Java Record

Прежде чем мы увидим Record в действии, создадим традиционный класс для нашей бейсболистской карты:

public class BaseballCard {
private final String playerName;
private final String team;
private final double battingAverage;

public BaseballCard(String playerName, String team, double battingAverage) {
this.playerName = playerName;
this.team = team;
this.battingAverage = battingAverage;
}

public String getPlayerName() {
return playerName;
}

public String getTeam() {
return team;
}

public double getBattingAverage() {
return battingAverage;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BaseballCard that = (BaseballCard) o;
return Double.compare(that.battingAverage, battingAverage) == 0 &&
Objects.equals(playerName, that.playerName) &&
Objects.equals(team, that.team);
}

@Override
public int hashCode() {
return Objects.hash(playerName, team, battingAverage);
}

@Override
public String toString() {
return "BaseballCard{" +
"playerName='" + playerName + '\'' +
", team='" + team + '\'' +
", battingAverage=" + battingAverage +
'}';
}
}

Уф! Это много кода для такого простого задания, правда? Теперь давайте посмотрим, как Records могут помочь нам.

Пример с использованием Java Record

Вот та же бейсболистская карта, реализованная как Record:

public record BaseballCard(String playerName, String team, double battingAverage) {}

Вот и все! Только одна строка кода. Но не позвольте простоте обмануть вас – этот Record упакован мощью. Он автоматически создает:

  • Конструктор
  • Методы получения для каждого поля
  • Методы equals(), hashCode() и toString()

Давайте используем наш новый Record:

public class BaseballCardDemo {
public static void main(String[] args) {
BaseballCard card = new BaseballCard("Babe Ruth", "New York Yankees", 0.342);

System.out.println(card.playerName());  // Выводит: Babe Ruth
System.out.println(card.team());        // Выводит: New York Yankees
System.out.println(card.battingAverage()); // Выводит: 0.342
System.out.println(card);  // Выводит: BaseballCard[playerName=Babe Ruth, team=New York Yankees, battingAverage=0.342]
}
}

Как вы можете видеть, мы можем создавать и использовать наш BaseballCard Record, как обычный класс, но с гораздо меньшим количеством кода!

Java Record для заблокированных интерфейсов

Records также могут реализовывать интерфейсы, включая заблокированные интерфейсы. Заблокированный интерфейс похож на VIP-клуб – он контролирует, какие классы могут быть его членами.

Вот пример:

public sealed interface Athlete permits BaseballPlayer, BasketballPlayer {}

public record BaseballPlayer(String name, String team) implements Athlete {}
public record BasketballPlayer(String name, String team) implements Athlete {}

public class SportsDemo {
public static void main(String[] args) {
Athlete player1 = new BaseballPlayer("Mike Trout", "Los Angeles Angels");
Athlete player2 = new BasketballPlayer("LeBron James", "Los Angeles Lakers");

System.out.println(player1);  // Выводит: BaseballPlayer[name=Mike Trout, team=Los Angeles Angels]
System.out.println(player2);  // Выводит: BasketballPlayer[name=LeBron James, team=Los Angeles Lakers]
}
}

В этом примере только BaseballPlayer и BasketballPlayer могут реализовывать интерфейс Athlete.

Переопределение методов Java Records

Хотя Records предоставляют автоматические реализации общих методов, вы все еще можете переопределить их, если это необходимо. Вот пример:

public record BaseballCard(String playerName, String team, double battingAverage) {
@Override
public String toString() {
return playerName + " играет за " + team + " с показателем отбивания " + battingAverage;
}
}

public class BaseballCardDemo {
public static void main(String[] args) {
BaseballCard card = new BaseballCard("Babe Ruth", "New York Yankees", 0.342);
System.out.println(card);  // Выводит: Babe Ruth играет за New York Yankees с показателем отбивания 0.342
}
}

Здесь мы переопределили метод toString(), чтобы предоставить более читаемый вывод.

Заключение

Java Records – это мощное средство для создания простых, ориентированных на данные классов с минимальным количеством вспомогательного кода. Они идеально подходят для группировки связанных частей данных вместе, как в нашем примере с бейсболистской картой.

Помните, программирование – это как обучение игре на инструменте – требует практики. Попробуйте создать свои собственные Records для различных типов данных. Может быть, создадите BookRecord или MovieRecord. Чем больше вы будете практиковаться, тем более уверенно вы будете чувствовать себя в этой концепции.

Продолжайте программировать, учитесь и, что самое важное, наслаждайтесь этим процессом! Кто знает, может быть, однажды вы создадите Java Record для хранения данных о своей собственной бестселлере по программированию. Мечтайте большими, пишите еще больше!

Credits: Image by storyset