В этой статье мы углубимся в новые функции, представленные в 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 | Твиттер | Подстек | Фейсбук