В этой статье мы углубимся в новые функции, представленные в Java 17. Пришло время подумать об обновлении с Java 8 до Java 17, поскольку теперь Java будет основывать все свои выпуски на Java 17 и предоставлять поддержку до 2030 года. Java 17 принесет исправления ошибок и улучшения для дальнейшего улучшения языка.

Зачем нам нужен закрытый класс?

Эта функция в Java направлена ​​на усиление контроля наследования с большей точностью. Запечатывание позволяет классам и интерфейсам указывать свои разрешенные подтипы, предоставляя им право определять, какие классы могут их реализовывать или расширять. Это ценное дополнение оказывается полезным для моделирования предметной области и повышения безопасности библиотек.

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

Например, рассмотрим область бизнеса, связанную исключительно с легковыми и грузовыми автомобилями, за исключением мотоциклов. Для этого при разработке абстрактного класса «Транспортное средство» в Java мы стремимся ограничить его расширение исключительно классами «Автомобиль» и «Грузовик». Это ограничение обеспечивает правильное использование абстрактного класса «Автомобиль» в нашем домене, предотвращая непреднамеренные подклассы.

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

До версии Java 15, которая представила запечатанные классы в качестве предварительного просмотра, повторное использование кода предполагалось как всеобъемлющая цель, позволяющая расширять любой класс за счет неограниченного количества подклассов.

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

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

Закрытый интерфейс:

Чтобы создать запечатанный интерфейс, мы просто применяем модификатор «запечатанный» к его объявлению. Последующее предложение «разрешения» позволяет нам указать классы, которым разрешено реализовывать этот запечатанный интерфейс:

public sealed interface Service permits Car, Truck {

    int getMaxServiceIntervalInMonths();

    default int getMaxDistanceBetweenServicesInKilometers() {
        return 100000;
    }

}

Запечатанные классы:

Как и интерфейсы, классы могут быть запечатаны с помощью модификатора sealed. Для обеспечения правильного синтаксиса предложение «разрешает» должно быть помещено после любых предложений «расширяет» или «реализует»:

public abstract sealed class Vehicle permits Car, Truck {

    protected final String registrationNumber;

    public Vehicle(String registrationNumber) {
        this.registrationNumber = registrationNumber;
    }

    public String getRegistrationNumber() {
        return registrationNumber;
    }

}

Разрешенный подкласс должен определять модификатор. Он может быть объявлен final, чтобы предотвратить дальнейшее расширение:

public final class Truck extends Vehicle implements Service {

    private final int loadCapacity;

    public Truck(int loadCapacity, String registrationNumber) {
        super(registrationNumber);
        this.loadCapacity = loadCapacity;
    }

    public int getLoadCapacity() {
        return loadCapacity;
    }

    @Override
    public int getMaxServiceIntervalInMonths() {
        return 18;
    }

}

Разрешенный подкласс также может быть объявлен запечатанным. Однако если мы объявим его незапечатанным, то он будет открыт для расширения:

public final class Car extends Vehicle implements Service {

    private final int numberOfSeats;

    public Car(int numberOfSeats, String registrationNumber) {
        super(registrationNumber);
        this.numberOfSeats = numberOfSeats;
    }

    public int getNumberOfSeats() {
        return numberOfSeats;
    }

    @Override
    public int getMaxServiceIntervalInMonths() {
        return 12;
    }

}

Вы готовитесь к собеседованию в качестве разработчика Java? Поздравляем! Чтобы помочь вам успешно пройти собеседование, мы составили исчерпывающий список основных вопросов для собеседования с Java-разработчиком. Являетесь ли вы новичком или опытным разработчиком, эти вопросы охватывают широкий спектр концепций Java, методов кодирования и лучших практик. Эта статья предоставит вам знания и уверенность, чтобы продемонстрировать свои знания в области Java, от базовой Java до сложных тем, таких как многопоточность, обработка исключений и шаблоны проектирования. Погрузитесь и подготовьтесь к следующему собеседованию с разработчиком Java!









Спасибо за прочтение

  • 👏 Пожалуйста, хлопайте в историю и подписывайтесь на меня 👉
  • 📰 Подробнее читайте в моем Medium(более 30 историй об интервью с Java-разработчиком)
  • Найдите мою книгу Guide To Clear Java Developer Interview здесь Gumroad(PDF Format) и Amazon (электронная книга Kindle).
  • 🔔 Следуйте за мной: LinkedIn | Твиттер | Подстек | Фейсбук