Gymterview
junior

Какие ключевые нововведения появились в Java 17?

Java 17 — второй LTS после Java 11, ставший минимальной версией для Spring Boot 3.x и Spring Framework 6.x. В этом релизе финализированы Records, Sealed Classes, Pattern Matching и Text Blocks.

Нововведения по версиям (Java 12-17)

Версия Нововведение
Java 12 Switch Expressions (preview)
Java 13 Text Blocks (preview)
Java 14 Records (preview), Pattern Matching для instanceof (preview), NullPointerException с подробностями
Java 15 Text Blocks (final), Sealed Classes (preview), ZGC (production)
Java 16 Records (final), Pattern Matching для instanceof (final), Stream.toList()
Java 17 Sealed Classes (final), удалён Security Manager, новый macOS rendering pipeline
Пример: Helpful NullPointerException и Stream.toList()
// Helpful NullPointerException (Java 14)
var user = getUser();
var street = user.getAddress().getStreet().toUpperCase();
// До Java 14: NullPointerException
// Java 14+: Cannot invoke "Address.getStreet()" because the return value of
//           "User.getAddress()" is null

// Stream.toList() (Java 16) — unmodifiable list
List<String> names = users.stream()
    .map(User::getName)
    .toList(); // вместо .collect(Collectors.toList())

Частые ошибки

  • stream().toList() vs stream().collect(Collectors.toList())toList() возвращает неизменяемый список; если нужен мутабельный — collect(Collectors.toList())
  • Не обновить зависимости при миграции на 17 — Lombok, Mockito, Byte Buddy, ASM требуют обновления

Как используется в 2026

  • Java 17 — актуальная LTS, широко используется в продакшене
  • Большинство enterprise-проектов на Java 17 или мигрируют на Java 21
  • Новые проекты стартуют на Java 21 или 25

На собеседовании: главное — знать, что Java 17 обязательна для Spring Boot 3.x, и уметь перечислить ключевые финализированные фичи: Records, Sealed Classes, Pattern Matching для instanceof, Text Blocks. Частая ошибка — не знать разницу между toList() и collect(Collectors.toList()).