← Назад к вопросам

С какими нововведениями Java 17 работаешь

2.0 Middle🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Java 17 — ключевые нововведения

Обзор Java 17

Java 17 (выпущена в сентябре 2021) — это долгосрочная версия поддержки (LTS), что делает её критически важной для production-окружений. Java 17 является преемницей Java 11 (предыдущая LTS) и введёт множество улучшений, ориентированных на современные паттерны разработки.

1. Sealed Classes (Запечатанные классы) — Preview → Standard

Sealed classes позволяют контролировать, какие классы могут наследоваться от данного класса. Это мощный инструмент для моделирования иерархий типов и pattern matching.

public sealed class Shape permits Circle, Rectangle, Triangle {
    public abstract double getArea();
}

public final class Circle extends Shape {
    private double radius;
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

public non-sealed class Rectangle extends Shape {
    // non-sealed позволяет другим классам наследоваться от Rectangle
    @Override
    public double getArea() {
        return 0; // реализация
    }
}

Преимущества:

  • Явный контроль над иерархией типов
  • Безопаснее, чем просто final классы
  • Работает идеально с pattern matching

2. Pattern Matching для switch (Preview → Standard)

Разы с Java 17 введено pattern matching для switch, что позволяет писать более выразительный и безопасный код:

public static String describeShape(Shape shape) {
    return switch (shape) {
        case Circle c -> String.format("Circle with radius %f", c.radius());
        case Rectangle r && r.width() == r.height() -> "Square";
        case Rectangle r -> String.format("Rectangle %fx%f", r.width(), r.height());
        case Triangle t -> "Triangle";
        default -> "Unknown";
    };
}

Это более безопасная альтернатива цепочкам if-else с instanceof.

3. Records (Preview → Standard)

Records — это компактный способ создания неизменяемых классов данных. Java 16 представила их в preview, а Java 17 сделала стандартом.

public record Person(String name, int age, String email) {}

// Автоматически генерируется:
// - конструктор
// - equals() и hashCode()
// - toString()
// - getters (name(), age(), email())

// Использование:
Person person = new Person("Alice", 30, "alice@example.com");
String name = person.name();

Рекомендации:

  • Используй records для DTO (Data Transfer Objects)
  • Отлично подходят для immutable данных
  • Можешь добавить кастомные методы в records
public record Rectangle(double width, double height) {
    public double getArea() {
        return width * height;
    }
}

4. Strong Encapsulation (Сильная инкапсуляция)

Java 17 усиливает инкапсуляцию JDK внутренних классов. Reflection-доступ к внутренним API (например, sun.misc.Unsafe) становится более ограниченным:

// Это больше не будет работать по умолчанию
try {
    Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
    unsafeField.setAccessible(true); // Может выбросить исключение
} catch (Exception e) {
    // Требуется флаг --add-opens
}

5. Removal of Deprecated Features

Java 17 удаляет несколько устаревших функций:

  • Applet API — полностью удалена
  • Security Manager — deprecations
  • RMI Activation — удалена

6. Helpful NullPointerExceptions

Java 14 представила улучшенные NPE-сообщения, Java 17 продолжает эту тенденцию:

Exception in thread "main" java.lang.NullPointerException: 
  Cannot invoke method "getName()" because "person" is null

Вместо просто "NullPointerException" видишь точное объяснение.

7. Vector API (Incubator)

Новый API для работы с векторными вычислениями, ориентированный на высокопроизводительные вычисления:

var species = FloatVector.SPECIES_256;
var a = FloatVector.fromArray(species, array1, 0);
var b = FloatVector.fromArray(species, array2, 0);
var c = a.mul(b);

8. Deprecations и Future Removals

Java 17 помечает следующие элементы для удаления в будущих версиях:

  • Finalization mechanism (финализаторы) — помечены как deprecated
  • Некоторые reflection-методы

Практические примеры использования

// Типичный паттерн: sealed + records + pattern matching
public sealed interface Result<T> permits Success, Failure {
}

public record Success<T>(T value) implements Result<T> {}
public record Failure<T>(String error) implements Result<T> {}

public static <T> void handleResult(Result<T> result) {
    var message = switch (result) {
        case Success<T> s -> "Success: " + s.value();
        case Failure<T> f -> "Error: " + f.error();
    };
    System.out.println(message);
}

Рекомендации

  • Мигрируй на Java 17, если используешь Java 11 или раньше
  • Используй records для новых DTO
  • Применяй sealed classes для ясной иерархии типов
  • Используй pattern matching вместо instanceof цепочек
  • Тестируй код с полной инкапсуляцией (флаги --add-opens)
С какими нововведениями Java 17 работаешь | PrepBro