💿 Java Records: Убийцы бойлерплейта
Сколько раз вы создавали класс просто чтобы "перенести данные" из точки А в точку Б?
Вы пишете 3 поля, а потом IDE генерирует вам 50 строк кода: конструктор, геттеры,
В Java 16+ этому положили конец. Встречайте Records.
📉 Было vs Стало
Допустим, нам нужен простой DTO для пользователя.
❌ Классический POJO (Java 1.0 - 15):
✅ Record (Java 16+):
Всё. Это одна строка. 🔥
⚙️ Что происходит под капотом?
Компилятор делает всю грязную работу за вас. Создавая
1. Приватные финальные поля (
2. Конструктор со всеми аргументами.
3. Геттеры (без префикса
4.
5.
🛠 Кастомизация (Compact Constructor)
"А что, если мне нужна валидация? Нельзя же создать юзера с отрицательным возрастом!"
Для этого есть Компактный конструктор. Вам даже не нужно перечислять аргументы:
⚠️ Ограничения (Важно знать)
Records, это не замена обычным классам во всем.
1. Они неизменяемы (Immutable). Сеттеров нет и не будет. Хотите поменять поле? Создавайте новый объект.
2. Нет наследования. Record не может наследовать (
💡 Когда использовать?
🔴 DTO (Data Transfer Objects): Ответы от API, запросы в БД.
🔴 Ключи для Map: Благодаря гарантированному
🔴 Внутри методов: Можно объявлять локальные рекорды прямо внутри метода, чтобы временно сгруппировать данные.
Records делают код чище и безопаснее. Они идеально сочетаются со Stream API, где данные постоянно передаются и преобразуются.
Если ваш класс это просто "мешок с данными", превращайте его в
#Java #Records #NewJava #CleanCode
📲 Мы в MAX
👉@BookJava
Сколько раз вы создавали класс просто чтобы "перенести данные" из точки А в точку Б?
Вы пишете 3 поля, а потом IDE генерирует вам 50 строк кода: конструктор, геттеры,
equals, hashCode, toString... 🤯В Java 16+ этому положили конец. Встречайте Records.
📉 Было vs Стало
Допустим, нам нужен простой DTO для пользователя.
❌ Классический POJO (Java 1.0 - 15):
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
// + equals()
// + hashCode()
// + toString() ... еще 30 строк кода
}
✅ Record (Java 16+):
public record User(String name, int age) {}
Всё. Это одна строка. 🔥
⚙️ Что происходит под капотом?
Компилятор делает всю грязную работу за вас. Создавая
record, вы автоматически получаете:1. Приватные финальные поля (
private final).2. Конструктор со всеми аргументами.
3. Геттеры (без префикса
get! Просто .name(), .age()).4.
equals() и hashCode() (идеально для ключей в Map или Set).5.
toString() (красивый вывод: User[name=Alex, age=25]).🛠 Кастомизация (Compact Constructor)
"А что, если мне нужна валидация? Нельзя же создать юзера с отрицательным возрастом!"
Для этого есть Компактный конструктор. Вам даже не нужно перечислять аргументы:
public record User(String name, int age) {
// Компактный конструктор
public User {
if (age < 0) {
throw new IllegalArgumentException("Возраст не может быть меньше 0");
}
// Присваивание this.age = age происходит автоматически!
}
}
⚠️ Ограничения (Важно знать)
Records, это не замена обычным классам во всем.
1. Они неизменяемы (Immutable). Сеттеров нет и не будет. Хотите поменять поле? Создавайте новый объект.
2. Нет наследования. Record не может наследовать (
extends) другой класс (потому что он уже наследует java.lang.Record). Но имплементировать интерфейсы (implements) можно!💡 Когда использовать?
equals/hashCode.Records делают код чище и безопаснее. Они идеально сочетаются со Stream API, где данные постоянно передаются и преобразуются.
Если ваш класс это просто "мешок с данными", превращайте его в
record.#Java #Records #NewJava #CleanCode
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
🔀 Switch Expressions: Прощай,
Помните это чувство, когда забыл написать
В современных версиях Java (стандарт с Java 14) оператор
💀 Было (Statement)
Громоздко, опасно (fall-through), переменная вынесена наружу.
✅ Стало (Expression)
Лаконично, безопасно, функционально.
🚀 Главные фишки
1. Стрелочный синтаксис (
Если используется стрелка, переход к следующему кейсу (fall-through) отключен по умолчанию. Никаких
2. Возврат значения
3. Несколько условий в одну строку
🛑 Сложная логика и
Что делать, если в одном
Для этого появились фигурные скобки и ключевое слово
Важно:
⚡ Exhaustiveness (Полнота)
Если вы делаете
🔥 Итог
Новый
🔴 Используйте
🔴 Используйте
#Java #SwitchExpression #CleanCode #NewJava
📲 Мы в MAX
👉@BookJava
break!Помните это чувство, когда забыл написать
break в switch-case, и код пошел выполняться дальше, создав неуловимый баг? 😫В современных версиях Java (стандарт с Java 14) оператор
switch прокачали. Теперь это не просто управляющая конструкция, а выражение, возвращающее результат.💀 Было (Statement)
Громоздко, опасно (fall-through), переменная вынесена наружу.
DayOfWeek day = DayOfWeek.SATURDAY;
int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break; // Забыл break? Получи баг!
case TUESDAY:
numLetters = 7;
break;
default:
throw new IllegalStateException("Wat: " + day);
}
✅ Стало (Expression)
Лаконично, безопасно, функционально.
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
default -> throw new IllegalStateException("Wat: " + day);
};
🚀 Главные фишки
1. Стрелочный синтаксис (
->)Если используется стрелка, переход к следующему кейсу (fall-through) отключен по умолчанию. Никаких
break больше писать не надо!2. Возврат значения
switch теперь работает как формула. Вы можете сразу присвоить результат переменной или вернуть его из метода (return switch(...)).3. Несколько условий в одну строку
case MONDAY, FRIDAY, SUNDAY — просто перечисляем через запятую.🛑 Сложная логика и
yieldЧто делать, если в одном
case нужно не просто вернуть число, а выполнить несколько строк кода (например, залоггировать)?Для этого появились фигурные скобки и ключевое слово
yield.Важно:
return использовать нельзя, так как он прервет выполнение всего метода, а не только свича.
String result = switch (day) {
case SATURDAY, SUNDAY -> "Выходной";
case MONDAY -> {
System.out.println("Тяжелый день...");
yield "Будни"; // yield возвращает значение из switch
}
default -> "Будни";
};
⚡ Exhaustiveness (Полнота)
Если вы делаете
switch по Enum, компилятор проверит, все ли варианты вы обработали. Если добавите в Enum новый день, а в свич - нет, код просто не скомпилируется. Это отличная защита от забывчивости!🔥 Итог
Новый
switch это чистый кайф. Он делает код компактнее и убирает целый класс ошибок, связанных с пропущенными break.->, когда нужно просто сопоставить значение.yield, если нужна логика внутри блока.#Java #SwitchExpression #CleanCode #NewJava
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3😁1
🔮 Pattern Matching в Switch: Типизируй это!
Помните этот бесконечный кошмар, когда вам приходит
Раньше мы писали "лестницу" из
❌ Было (Боль и слезы):
✅ Стало (Java 21 LTS):
Теперь
🛡 Guarded Patterns (Охрана в кейсах)
Но это еще не всё. Часто бывает, что тип нам подходит, но нужно проверить еще и значение.
Раньше пришлось бы ставить
👻 А как же Null?
В старом
В новом
⚡Это не просто "сахар". Это изменение подхода к полиморфизму.
Если раньше логика часто размазывалась по методам классов (
🔥 Итог
🔴
🔴 Кастинг происходит автоматически (
🔴 Можно уточнять условия через
🔴 Можно безопасно ловить
#PatternMatching #NewJava #CleanCode
📲 Мы в MAX
👉@BookJava
Помните этот бесконечный кошмар, когда вам приходит
Object, и нужно понять, что внутри?Раньше мы писали "лестницу" из
if-else и instanceof с кучей ручного кастинга (приведения типов).❌ Было (Боль и слезы):
Object obj = getUnknownObject();
if (obj instanceof String) {
String s = (String) obj; // Ручной каст
System.out.println("Строка: " + s.length());
} else if (obj instanceof Integer) {
Integer i = (Integer) obj; // Опять каст
System.out.println("Число: " + i);
} else if (obj instanceof Long) {
// ... и так до бесконечности
}
✅ Стало (Java 21 LTS):
Теперь
switch умеет проверять типы! Больше никаких instanceof и ручных приведений. Переменная создается прямо в кейсе.
switch (obj) {
case String s -> System.out.println("Строка: " + s.length());
case Integer i -> System.out.println("Число: " + i);
case Long l -> System.out.println("Длинное число: " + l);
default -> System.out.println("Непонятно что");
}
🛡 Guarded Patterns (Охрана в кейсах)
Но это еще не всё. Часто бывает, что тип нам подходит, но нужно проверить еще и значение.
Раньше пришлось бы ставить
if внутри case. Теперь у нас есть ключевое слово when.
switch (obj) {
// Попадет сюда, ТОЛЬКО если это строка И она длиннее 10 символов
case String s when s.length() > 10 ->
System.out.println("Длинная строка: " + s);
// Любая другая строка
case String s ->
System.out.println("Короткая строка: " + s);
case Integer i ->
System.out.println("Число: " + i);
default -> {}
}
👻 А как же Null?
В старом
switch, если передать null, мы мгновенно получали NullPointerException.В новом
switch можно (и нужно!) обрабатывать null легально:
switch (obj) {
case String s -> System.out.println("Это строка");
case null -> System.out.println("Пришел null!"); // Никакого NPE
default -> System.out.println("Что-то другое");
}
⚡Это не просто "сахар". Это изменение подхода к полиморфизму.
Если раньше логика часто размазывалась по методам классов (
animal.makeSound()), то теперь можно собирать логику обработки разных типов в одном месте, что часто бывает удобнее при написании бизнес-логики (например, обработка разных типов ивентов или DTO).🔥 Итог
Switch теперь принимает любые объекты.case String s).when.null.#PatternMatching #NewJava #CleanCode
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6